【问题标题】:MVC Autogenerated Index method - why is .include needed?MVC 自动生成索引方法 - 为什么需要 .include?
【发布时间】:2017-01-11 06:15:58
【问题描述】:

我有一个 MVC 项目,我使用 EF 从 Northwind 数据库中引入 Products 和 Categories 表。 Products 表在 CategoryID 上对 Categories 表的 CategoryID 字段有一个外键约束。我使用向导使用 EF 添加带有视图的 MVC 5 控制器。 Index action 方法有这个代码

// GET: Products
    public ActionResult Index()
    {
        var products = db.Products.Include(p => p.Category);
        return View(products.ToList());
    }

我假设 .include 用于引入类别并允许在视图中显示类别名称。但是后来我查看了 Details 操作方法,它没有使用此代码,即使它确实显示了类别名称。然后我尝试从 Index 方法中剥离 .include 来得到这个

var products = db.Products;

并运行它,我仍然会在视图中显示类别名称。所以现在我很困惑为什么 .include 代码在 Index 操作方法中而不是在 Details 方法中。任何意见表示赞赏。

谢谢

【问题讨论】:

  • 如果您事先知道您将需要Category,那么最好使用Include(),以便EF 生成更有效的SQL 来检索它。当您不使用Include() 时,EF 将以“延迟加载”模式运行,并在尝试访问Category 时发出另一个 SQL。显然,延迟加载只有在配置中启用时才会起作用(默认情况下)。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

Include 对底层 SQL 查询有影响。使用时,查询将对 Category 表进行连接,否则,查询将仅从 Products 表加载数据。如果启用了延迟加载(默认情况下),则在访问属性时将从数据库中加载类别。

从应用程序中,这意味着您得到完全相同的结果。不同的是,使用Include,只会进行一次查询,没有它,您将有一次查询来检索产品列表,然后每次您第一次需要访问产品的Category时再一次。性能影响可能很大(这被称为 N+1 问题,因为要加载 N 个项目的列表,您必须对数据库进行 N+1 次往返)。

【讨论】:

  • 对于一个热切的laoded查询,你可以用objectContext.LazyLoadingEnabled = false;设置延迟加载
  • 谢谢,这让事情变得更清楚了。但我仍然不确定为什么 .include 不在 Details 方法中。 Details 和 Index 视图都需要显示 CategoryName。它是一种方法而不是另一种方法只是一个怪癖,还是我仍然错过了什么?
  • 我猜这只是因为在 Details 方法中,您可能只加载了 1 个对象,这意味着延迟加载对性能的影响远小于对索引的性能影响,因为索引可能会加载数百个对象。对我来说,看起来代码是在没有任何Include 的情况下首先编写的,后来在优化时,它被添加到性能影响最大的地方。
猜你喜欢
  • 2015-07-12
  • 2010-10-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 2017-11-18
相关资源
最近更新 更多