【问题标题】:The purpose of Include() in ASP.NET MVC + Entity FrameworkASP.NET MVC + Entity Framework中Include()的用途
【发布时间】:2011-11-14 07:03:58
【问题描述】:

在 Visual Studio 生成的控制器以及示例应用程序 (ContosoUniversity) 中,Index 操作始终具有类似

var departments = db.Departments.Include(d => d.Administrator);

和有什么区别

var departments = db.Departments;

首先我怀疑第一个(包含)使视图能够检索部门.管理员。但第二个(不包含)似乎也能做到这一点。

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework asp.net-mvc-3 entity-framework-4.1


    【解决方案1】:

    请参阅本教程中的“相关数据的延迟、急切和显式加载”部分: http://www.asp.net/entity-framework/tutorials/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

    【讨论】:

      【解决方案2】:

      在第一种情况下(使用包含),当您编写 department.Administrator 时,服务器会从内存中获取由于 Include 方法而被急切加载的对象。第二种情况,会执行一条sql语句,从数据库中获取每个部门对象的Administrator记录。

      【讨论】:

      • 感谢您的回答。我投了赞成票,我希望我可以标记多个答案。
      【解决方案3】:
      var departments = db.Departments;
      

      仅当启用LazyLoadingEnabled 并且在连接字符串中将MultipleActiveResultSets 设置为true 时,才会检索聚合域。

      【讨论】:

      • 感谢您的回答。我投了赞成票,我希望我可以标记多个答案。
      【解决方案4】:

      Include 告诉 Entity Framework 工作在结果中急切地加载每个部门的管理员。在这种情况下,Entity Framework 可以使用 SQL 连接在一个请求中从两个表中获取数据。

      代码在没有包含的情况下仍然可以工作,但是当您第一次访问部门的管理员时,EF 需要点击数据库来加载它(因为它没有预加载)。按需加载数据(惰性)是一个不错的功能,但它可能是一个严重的性能问题(称为N+1 问题)。特别是如果您正在访问每个部门的管理员(例如,在一个循环中) - 而不是一个数据库调用,您最终会得到很多!

      【讨论】:

      • 不确定我是否理解正确。使用 Include,EF 将使用 join 在单个查询中同时获取部门及其管理员。没有Include,EF只会抢Departments,然后按需抢Administrators?因此,如果我在部门中只需要一两个管理员,我不应该使用 Include。但如果我需要所有(或大部分)部门的管理员,我应该使用 Include。
      • 确切地说,包含强制将管理员加载到加载部门的同一查询中。如果没有包含,管理员会根据需要一次加载一个。
      • @Jim,特别是,由于您使用 ASP.NET MVC,您不希望您的视图与数据库联系。要使departments.First().Administrator 在没有数据库访问权限的情况下工作,需要使用Include 预加载Administrator
      • @Jim 如果您的模型中存在一对多关系,则选择延迟加载,如果多对多则急切加载会是更好的选择。
      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2012-11-23
      • 2015-06-10
      • 1970-01-01
      相关资源
      最近更新 更多