【问题标题】:Difference between using Load method and Lazy loading in entity framework在实体框架中使用 Load 方法和延迟加载的区别
【发布时间】:2011-07-13 09:48:41
【问题描述】:

我阅读了这个What is the difference between Lazy Loading and Load() 线程以了解在实体框架中使用 Load 方法和延迟加载之间的区别。但是在那个例子中使用延迟加载和 Load 方法具有相同的效果。能否请您举个例子来了解在哪里使用延迟加载以及在哪里使用 Load 方法?

【问题讨论】:

    标签: entity-framework load lazy-evaluation


    【解决方案1】:

    如果我们假设 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 会为您加载地址 - 无需进行任何显式调用。

    希望对你有所帮助...

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 所以你的意思是这些和内部没有区别?
      • 是的。在透明延迟加载的情况下,只有隐藏层可以执行您在显式加载中必须手动执行的操作。
      猜你喜欢
      • 2011-11-24
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多