加载导航属性的顺序

时间:2013-07-13 18:12:26

标签: entity-framework entity-framework-5

我的问题是关于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

相反,交换Include()似乎没有任何后果。我使用EF 5。

为了避免过于复杂的事件处理(负责在给定账单树的所有实体对象中更新属性值,我正在寻找某些假设。

在您看来,是否合理地假设保留了某个加载顺序?

1 个答案:

答案 0 :(得分:0)

在假设至少父母实体在孩子之前加载(即比尔在产品之前加载)之后,今天我开悟了(感谢Colin Blair!),因为在父母之前加载了一个子实体。因此,对于初始化事件处理,有以下两种解决方案。

  1. 重写OnLoaded并认为子实体可能已存在于实体集合中(即Bill.Prodcuts.Count!= 0)
  2. 异步调用初始化代码(在加载完整的实体树之后执行),如Colin Blair所述。 [1]
  3. [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