在实体框架中使用Load方法和Lazy加载之间的区别

时间:2011-07-13 09:48:42

标签: entity-framework load lazy-evaluation

我阅读了这个What is the difference between Lazy Loading and Load()线程,以了解在实体框架中使用Load方法和延迟加载之间的区别。但在该示例中使用延迟加载和Load方法具有相同的效果。你能不能给我一个例子来了解在何处使用延迟加载以及在哪里使用Load方法?

2 个答案:

答案 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