禁用代理创建和延迟加载的实体框架仍在加载子对象

时间:2013-05-14 02:46:18

标签: entity-framework entity-framework-5

我在实体框架中遇到了一些使用POCO的问题,我希望有人可以告诉我,如果我看到的行为是预期的,或者我需要更深入地了解它为什么会发生。

我有一个班级Customer和另一个CustomerType,因此Customer有一个属性Type(类型为CustomerType,表示类型)和{{1具有属性CustomerType,它是Customers s(具有该类型的所有Customer s)的集合所以这些基本上是关联两端的导航属性,导致POCO代码类似于:

Customer

我已关闭代理创建和LazyLoading(即public partial class Customer { public int Id { get; set; } public string Name { get; set; } public int TypeId { get; set; } public CustomerType Type { get; set; } } public partial class CustomerType { public CustomerType() { this.Customers = new HashSet<CustomerType>(); } public int Id { get; set; } public string TypeName { get; set; } public virtual ICollection<Customer> Customers { get; set; } } DbContext.Configuration.ProxyCreationEnabled=false)因为它们使序列化变得痛苦。

正如我从DbContext.Configuration.LazyLoadingEnabled=false集获取实例时所预期的那样,默认情况下它们上的Customer属性为null。

但是如果我从Type集合中获取Customer的实例,不仅会加载.Include("Type")属性,而且还会加载子项 - 即{{1}的集合每个都是这样的。

这是预期的吗?

1 个答案:

答案 0 :(得分:2)

这是半预期的。 Include扩展会影响运行的SQL。加载的那些CustomerType(由于包含在Customer查询中)将根据CustomerType.ParentId列构建到对象树中。

因此,如果通过某些侥幸父母和孩子都加载到同一个查询中,孩子将被填充到父母中。