【发布时间】:2011-07-13 09:48:41
【问题描述】:
我阅读了这个What is the difference between Lazy Loading and Load() 线程以了解在实体框架中使用 Load 方法和延迟加载之间的区别。但是在那个例子中使用延迟加载和 Load 方法具有相同的效果。能否请您举个例子来了解在哪里使用延迟加载以及在哪里使用 Load 方法?
【问题讨论】:
标签: entity-framework load lazy-evaluation
我阅读了这个What is the difference between Lazy Loading and Load() 线程以了解在实体框架中使用 Load 方法和延迟加载之间的区别。但是在那个例子中使用延迟加载和 Load 方法具有相同的效果。能否请您举个例子来了解在哪里使用延迟加载以及在哪里使用 Load 方法?
【问题讨论】:
标签: entity-framework load lazy-evaluation
如果我们假设 Lazy Loading 处于关闭状态,并且地址不在 Include 方法中,则以下代码将引发异常,因为地址将为空。
var query = from c in context.Contacts select c;
foreach ( var contact in query ) {
if ( contact.ID == 5 ) {
Console.WriteLine( contact.Addresses.City );
}
}
添加加载调用:
var query = from c in context.Contacts select c;
foreach ( var contact in query ) {
if ( contact.ID == 5 ) {
contact.Addresses.Load()
Console.WriteLine( contact.Addresses.City );
}
}
显式加载地址,因此可以防止异常。
如果Lazy Loading 在第一个代码块上也不会引发异常,因为 EF 会为您加载地址 - 无需进行任何显式调用。
希望对你有所帮助...
【讨论】:
延迟加载实际上是调用Load 方法,即使我们也为此使用显式加载,因为您必须手动调用Load 方法。 EFv4+中通常用作延迟加载的应该称为透明延迟加载。这意味着您不必进行任何特殊调用,EF 将为您加载关系。
EF 使用动态代理进行延迟加载。这些代理是从实体派生并在运行时创建的类型。我没有看到这些代理的代码,但我相信如果支持字段是 null,它们实际上会在属性 getter 中调用 Load。
【讨论】: