2013-07-13 37 views
0

我的问题是关于EF提供的广度优先的实体检索。 在我的EF代码优先模型中,我有一个树状分层结构,例如由产品实例和一些附加费组成的账单。加载导航属性的顺序

public class Bill 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<BillSurcharge> Surcharges { get; set; } 
    // ... 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public virtual Bill Bill { get; set; } 
    public int BillId { get; set; } 
    public virtual ICollection<ProductSurcharge> Surcharges { get; set; } 
    // ... 
} 
// ... 

我观察到,在上述实体的情况下,查询

context.Bills.Include("Products").Include("Products.Surcharges").Include("Surcharges") 

导致实体检索的以下序列。

  • 比尔
  • Bill.Products
  • Bill.Surcharges
  • Bill.Products.Surcharges

然而,交换宣称产品及附加结果如下顺序线。

  • 比尔
  • Bill.Surcharges
  • Bill.Products
  • Bill.Products.Surcharges

相反,交换包括()似乎并没有什么后果。我使用EF 5

为了避免过度复杂的事件处理(负责在给定的法案树的所有实体对象的属性值的更新,我找了一些假设。

难道是在你的意见,合理地假设一定的加载顺序被保留?

+0

重复:http://stackoverflow.com/questions/14191288/how-to-determine-the-order-of-property-loading-in-codefirst – Simon

回答

0

在假定至少父实体在孩子之前加载(即比尔在产品之前加载)之后,今天我开悟了(感谢科林布莱尔! ),因为子实体是在父代之前加载的,所以初始化事件处理有以下两种解决方案:

  1. 覆盖OnLoaded并认为子实体可能已经存在于实体集合中(即, Bill.Prodcuts.Count!= 0)
  2. 异步调用初始化代码(在加载完整实体树后执行),如Colin Blair所述。 [1]

[1] http://social.msdn.microsoft.com/Forums/silverlight/en-US/7c2802b2-7a7e-4655-aba6-900b6e9ef626/observing-loading-child-entities-by-adding-event-handlers-in-an-overriden-onloaded-method