在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;
}
}
}
即使执行了订单,它也会变空。