我阅读了这个What is the difference between Lazy Loading and Load()线程,以了解在实体框架中使用Load方法和延迟加载之间的区别。但在该示例中使用延迟加载和Load方法具有相同的效果。你能不能给我一个例子来了解在何处使用延迟加载以及在哪里使用Load方法?
答案 0 :(得分:2)
如果我们假设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会为您加载地址 - 而不进行任何显式调用。
我希望有所帮助...
答案 1 :(得分:1)
延迟加载实际上是调用Load
方法,即使我们也使用显式加载,因为您必须手动调用Load
方法。在EFv4 +中通常用作延迟加载的内容应该称为透明延迟加载。这意味着您不必进行任何特殊呼叫,EF将为您加载关系。
EF使用动态代理进行延迟加载。这些代理是从实体派生并在运行时创建的类型。我没有看到这些代理的代码,但我相信如果支持字段是Load
,他们实际上会在属性getter中调用null
。