Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架中使用加载方法和延迟加载的区别_Entity Framework_Load_Lazy Evaluation - Fatal编程技术网

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

Entity framework 实体框架中使用加载方法和延迟加载的区别,entity-framework,load,lazy-evaluation,Entity Framework,Load,Lazy Evaluation,我阅读此线程是为了理解在实体框架中使用加载方法和延迟加载之间的区别。但在那个示例中,使用延迟加载和加载方法具有相同的效果。你能给我一个例子来理解在哪里使用延迟加载和在哪里使用加载方法吗?延迟加载实际上是调用Load方法,即使我们也使用显式加载,因为你必须手动调用Load方法。EFv4+中通常用作延迟加载的内容应称为透明延迟加载。这意味着您不必进行任何特殊调用,EF将为您加载关系 EF使用动态代理进行延迟加载。这些代理是从实体派生并在运行时创建的类型。我没有看到这些代理的代码,但我相信,如果支持字

我阅读此线程是为了理解在实体框架中使用加载方法和延迟加载之间的区别。但在那个示例中,使用延迟加载和加载方法具有相同的效果。你能给我一个例子来理解在哪里使用延迟加载和在哪里使用加载方法吗?

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


EF使用动态代理进行延迟加载。这些代理是从实体派生并在运行时创建的类型。我没有看到这些代理的代码,但我相信,如果支持字段为
null
的话,它们实际上在属性getter中调用
Load
,延迟加载实际上在调用
Load
方法,即使我们也使用显式加载,因为您必须手动调用
Load
方法。EFv4+中通常用作延迟加载的内容应称为透明延迟加载。这意味着您不必进行任何特殊调用,EF将为您加载关系

EF使用动态代理进行延迟加载。这些代理是从实体派生并在运行时创建的类型。我没有看到这些代理的代码,但我相信,如果backing字段为
null
,那么它们实际上会在属性getter中调用
Load
,如果我们假设为off,并且地址不在方法中,那么下面的代码位将引发异常,因为地址将为空

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 );
     }
}
显式加载地址,从而防止出现异常

If在第一块代码上也不会引发异常,因为EF将为您加载地址,而不会进行任何显式调用

我希望这有点帮助…

如果我们假设为关闭,并且地址不在某个方法中,那么下面的代码位将引发异常,因为地址将为空

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 );
     }
}
显式加载地址,从而防止出现异常

If在第一块代码上也不会引发异常,因为EF将为您加载地址,而不会进行任何显式调用


我希望这有点帮助…

所以你的意思是,这些对内部来说没有区别?是的。在透明延迟加载的情况下,只有隐藏层执行显式加载中必须手动执行的操作。因此,您要说的是,在内部,这些操作没有区别?是的。在透明延迟加载的情况下,只有隐藏层执行显式加载中必须手动执行的操作。