创建相关实体后,为什么导航属性不会延迟加载?

时间:2019-07-10 23:00:51

标签: c# .net entity-framework entity-framework-6

在Entity Framework中,我有一个类Order:

public class Order 
{
    public Order() 
    {
        this.Info = new HashSet<OrderInfo>();
    }

    [Required]
    public int Id { get; set; }

    [NotNull, MapTo("RecordId")]
    public virtual ICollection<OrderInfo> Info { get; set; }
}

与OrderInfo类具有一对多关系:

public class OrderInfo
{
    public OrderInfo() { }

    public int RecordId { get; set; }
}

在我的OrderInfo表中,RecordId是与订单的Id列(订单的主键)相对应的外键。

我正在创建一个Order对象,然后创建一个将映射到该订单的OrderInfo。像这样:

using (var context = new MyDbContextClass())
{
    // method that creates an Order, adds it to the context's change tracker
    // and returns the order's Id
    var orderId = await CreateOrder(); 

    // method that creates an OrderInfo with orderId as its RecordId
    // and adds it to the context's change tracker
    await CreateOrderInfo(orderId, "Order info contents");

    // calls DbContext.SaveChanges()
    await context.Commit();

    var order = context.Order.Find(orderId);
    var associatedOrderInfo = order.Info;

    var queriedOrderInfo = context.OrderInfo.Where(info => info.RecordId == orderId);
}

associatedOrderInfo始终为空,queriedOrderInfo始终具有预期值。另外,如果我随后打开一个新上下文并再次通过ID检索订单,则其信息包含期望值。

我已确认以下内容:

  • context.Configuration.ProxyCreationEnabled是正确的(已通过调试器验证)
  • context.Configuration.LazyLoadingEnabled是正确的(已通过调试器验证)
  • 将导航属性声明为public virtual
  • 导航属性中引用的类型具有公共的,无参数的构造函数。

根据我对延迟加载的理解,它会在数据库中查询以订单ID为RecordId的OrderInfo对象。至此,数据已经提交,并且我的隔离级别已提交。因此,该订单应该在我第一次询问时给我相关的OrderInfo对象,而不要让我打开新的上下文来查找它们。 为什么它变空了?


编辑:

我也试图像this question中那样强制导航属性的延迟初始化。这是我的订单类:

public class Order 
{
    public Order() 
    {
    }

    [Required]
    public int Id { get; set; }

    private ICollection<OrderInfo> _Info;

    [NotNull, MapTo("RecordId")]
    public virtual ICollection<OrderInfo> Info
    {
        get
        {
            return this._Info ?? (this._Info= new HashSet<OrderInfo>());
        }
        set
        {
            this._Info = value;
        }
    }
}

即使执行了订单,它也会变空。

0 个答案:

没有答案