我正在使用DbContext,EF 6.1.3,并启用了延迟加载。延迟加载适用于通过查询检索的条目,但不适用于新创建的实体。有人知道行为不同的原因吗?下面是一个示例,我刚刚使用Linqpad运行:
var job=BookingSet.Create();
BookingSet.Add(job);
job.GetType().Dump();
job.ContentClassID=1;
(job.ContentClass?.IsEmpty==null).Dump();
job = BookingSet.First(x=> x.ContentClassID == 1);
job.GetType().Dump();
(job.ContentClass?.IsEmpty==null).Dump();
如果您不熟悉它,此示例中的转储基本上是打印。我没有包含模型细节,但我认为没有相关的 - 对于我尝试过的各种实体,行为是相同的
这是输出:
System.Data.Entity.DynamicProxies.Booking_87C5BB16B1BBF0B2C1EEF997F61811A51402A5E75697491AA3D7A7922950FBE6
True
System.Data.Entity.DynamicProxies.Booking_87C5BB16B1BBF0B2C1EEF997F61811A51402A5E75697491AA3D7A7922950FBE6
False
我们有一个与另一个实体有关系的实体。第一个代码块创建一个实体并转储其类型,然后尝试导航到相关实体,但失败。第二个代码块从第一个示例加载具有相同外键值的实体。它转储类型并执行与第一个示例相同的检查,但这次,正如您所期望的那样,检查有效。在这两个实例中,我们都有一个代理类,但第一个例子并没有延迟加载
答案 0 :(得分:0)
来自DSet.Create
的文档:
为此集的类型创建实体的新实例。请注意,此实例未添加或附加到集合。如果基础上下文配置为创建代理并且实体类型满足创建代理的要求,则返回的实例将是代理。
因此,您需要附加它,而不是添加到您的设置中。此外,您需要设置主键属性的值。所以你的代码应该是这样的:
var job=BookingSet.Create();
job.Id = 123;
BookingSet.Attach(job);
(job.ContentClass?.IsEmpty==null).Dump();
答案 1 :(得分:0)
这是github对此问题的正式回答:
EF6和所有早期版本的EF不会对处于已添加状态的实体进行延迟加载。这样做的主要原因是添加的实体的跟踪方式与其他实体不同,并且没有真正的密钥。他们也没有以同样的方式修复。这意味着延迟加载的一般情况变得不一致。在您的情况下,如果已添加的实体位于关系的从属端并且已设置了FK,则可以正确进行延迟加载。然而,即便如此,我们还没有看到太多的需求,并且考虑到如果你真的理解了幕后发生的事情,只会让它变得有意义,我们决定不做延迟加载添加了实体。