我的问题是关于 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。
为了避免过于复杂的事件处理(负责给定账单树的所有实体对象中的属性值更新,我正在寻找某些假设。
在您看来,假设保持一定的加载顺序是否合理?