代码之家  ›  专栏  ›  技术社区  ›  Brandon

实体框架-它什么时候自动加载引用的关系?

  •  1
  • Brandon  · 技术社区  · 15 年前

    在什么情况下,当您使用实体框架时,它会自动加载子行和其他相关行?似乎有时候这是在属性访问器上自动完成的,有时候您必须显式完成。

    例如,如果我有一个名为 小型车 和一个名为 车轮 ,并且每排车有4个轮对,将ef自动加载 车轮 访问时的行数 迈克轮 或者是一般惯例 mycar.wheel.load()。 第一?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Craig Stuntz    15 年前

    在EF4中,如果使用代码生成或代理,则默认情况下会执行延迟加载。”纯“poco(不要与所谓的poco代理混淆)无法执行延迟加载,除非您为其编写代码。更多细节如下 in this post .

    在EF1中,没有延迟加载,因此必须使用显式加载、预加载或投影。

    显式加载意味着调用 Load() . 你一般都会测试 IsLoaded 打电话之前 加载() .

    预加载会导致属性与实体本身一起加载。这样就避免了第二个数据库查询。

    Projection 使ef以优化的方式仅为所需的属性生成SQL。

    尽管EF4中默认启用了延迟加载,但在任何ORM中,它都是相对低效的(会导致许多DB查询)。您可能仍然希望使用投影或预加载。

        2
  •  0
  •   Justin Niessner    15 年前

    在使用实体框架时,一般的做法是检查是否加载了子框架……如果没有,则加载它。

    if (!order.SalesOrderDetail.IsLoaded)
    {
        order.SalesOrderDetail.Load();
    }
    

    直接来自:

    How to: Explicity Load Related Objects (Entity Framework)

        3
  •  0
  •   Community CDub    7 年前

    在Entity Framework版本1(aka 3.5)中,只有三种情况下,EF可能从相关表中加载数据:

    1. 在LINQ查询中显式联接到该表
    2. 在LINQ查询中使用include语法(请参见 Linq-To-Entities Include )
    3. 你可以使用克雷格·斯图茨回答中描述的投影。

    上面描述的所有三个场景都要求显式指定要加载相关表数据。据我所知,如果没有你的请求,EF v1永远不会在“幕后”进行(这可以被视为一个积极的,但它不是其他现代ORM的工作方式,他们在版本2-也就是版本4.0中更改了它)。