实体框架中使用Load方法和延迟加载的区别



我读了这篇文章,了解在实体框架中使用Load方法和Lazy Loading方法的区别。但是在这个例子中,使用延迟加载和Load方法具有相同的效果。你能给我一个例子来理解在哪里使用延迟加载和在哪里使用Load方法吗?

如果我们假设延迟加载是关闭的,并且地址不在Include方法中,下面的代码位将引发异常,因为地址将为空。

var query = from c in context.Contacts select c;
foreach ( var contact in query ) {
     if ( contact.ID == 5 ) {
        Console.WriteLine( contact.Addresses.City );
     }
}

添加Load调用:

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 );
     }
}

显式加载地址,因此可以防止异常。

如果延迟加载是在第一个代码块上,也不会引发异常,因为EF会为你加载地址——不需要进行任何显式调用。

延迟加载实际上是调用Load方法,即使我们也使用显式加载,因为你必须手动调用Load方法。EFv4+中通常使用的延迟加载应该称为透明延迟加载。这意味着你不需要做任何特殊的调用,EF会为你加载关系。

EF使用动态代理进行延迟加载。这些代理是从实体派生的类型,并在运行时创建。我没有看到这些代理的代码,但我相信他们实际上在属性getter中调用Load,如果后台字段是null

最新更新