我在实体框架中遇到了一些使用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}的集合每个都是这样的。
这是预期的吗?
答案 0 :(得分:2)
这是半预期的。 Include扩展会影响运行的SQL。加载的那些CustomerType(由于包含在Customer查询中)将根据CustomerType.ParentId列构建到对象树中。
因此,如果通过某些侥幸父母和孩子都加载到同一个查询中,孩子将被填充到父母中。