【发布时间】:2016-08-10 12:17:41
【问题描述】:
我有以下实体
public class A
{
public int AId {get; set;}
}
public class B
{
public int BId {get; set;}
public virtual A Child1 {get; set;}
public virtual A Child2 {get; set;}
}
使用以下配置
modelBuilder.Entity<B>()
.HasRequired(x => x.Child1)
.WithMany()
.Map(x => x.MapKey("Child1Id"))
modelBuilder.Entity<B>()
.HasRequired(x => x.Child2)
.WithMany()
.Map(x => x.MapKey("Child2Id"))
由于某种原因,实体框架在请求对象 B 的实体时不会延迟加载 Child1 或 Child2 属性。即
var b1 = context.Bs.FirstOrDefault();
Assert.IsNull(b.Child1) // true
Assert.IsNull(b.Child2) // true
但如果我明确加载它们,它会起作用。
var b2 = context.Bs.Include(x => x.Child1).Include(x => x.Child2).FirstOrDefault();
Assert.NotNull(b2.Child1) // true
Assert.NotNull(b2.Child2) // true
有谁知道为什么属性没有延迟加载?
编辑
好像
context.Bs.FirstOrDefault()
返回实体本身而不是代理类型。这表明该物业 ProxyCreationEnabled 是 false,但我已经仔细检查过它并设置为 true。
编辑 2
好的,终于找到问题了。我已将 Bs 构造函数设置为私有,这当然使得无法使用代理类扩展对象。因此,导航属性设置为 null。
【问题讨论】:
-
他们已经被延迟加载......因为他们不存在(延迟部分)
-
阅读这篇精彩的文章loading entities from msdn
-
不存在属性,如果我在查询中明确包含它们,它就可以工作。
-
您是否在 EF 选项中启用了延迟加载?
-
是的,它已启用。
标签: c# entity-framework entity-framework-6 lazy-loading