我读了这篇文章,了解在实体框架中使用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
。