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")

导致以下实体检索序列。

  • 账单
  • 比尔.产品
  • 账单附加费
  • 账单.产品.附加费

但是,交换声明产品和附加费的行会产生以下顺序。

  • 账单
  • 账单附加费
  • 比尔.产品
  • 账单.产品.附加费

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

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

在您看来,假设保持一定的加载顺序是否合理?

4

1 回答 1

0

假设至少父实体在子实体之前加载(即 Bill 在 Product 之前加载),我今天受到启发(感谢 Colin Blair!),因为子实体在父实体之前加载。因此,对于初始化事件处理,有以下两种解决方案。

  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

于 2013-07-17T18:34:40.560 回答