【问题标题】:How to prevent lazy loading in partial views, custom Display/Editor Templates?如何防止部分视图、自定义显示/编辑器模板中的延迟加载?
【发布时间】:2015-09-19 18:11:03
【问题描述】:

在我的 ASP.NET MVC 4 Web 应用程序中,我利用部分视图和自定义显示/编辑器模板来模块化代码。一个例子是 User.cshtml DisplayTemplate,它接受 User(一个实体对象)并打印出他们的名字和一个图标来弹出他们的目录信息。

Views/Shared/DisplayTemplates/User.cshtml

@model MyApp.Domain.Entities.User

@if (Model != null) {
  @Html.DisplayFor(m => m.DisplayName)
  <span class="view-contact icon ui-icon ui-icon-contact" title="View Contact"></span>
  @Html.HiddenFor(m => m.Identity)
}

当我搜索该主题时,我遇到了大多数人似乎遇到的相反问题。我注意到,当我使用这个模板时,会触发延迟加载,因此会向数据库发送一个查询以获取数据,但如果我已经预加载了数据,我不希望这种情况发生,尤其是在我显示用户列表的情况。在这种情况下,我确保在我的查询中使用 .Include("User") 并且当我在视图中写出模板的代码时,信息显示没有问题或额外的查询:

Views/MyController/List.cshtml 的简化摘录

...

@foreach (var item in Model) {
  <tr>
    <td class="alignl">
      @item.User.DisplayName
      <span class="view-contact icon ui-icon ui-icon-contact" title="View Contact"></span>
      @Html.HiddenFor(m => item.User.Identity)
    </td>
  </tr>
}

...

如果我将这三行替换为对模板的调用,则每一行都会查询数据库。

@foreach (var item in Model) {
  <tr>
    <td class="alignl">
      @Html.DisplayFor(i => item.User)
    </td>
  </tr>
}

如何使用此模板而不触发不必要的查询?

【问题讨论】:

  • 究竟何时触发延迟加载,延迟加载what?你知道你可以关闭延迟加载吗?
  • 它在视图中的 foreach 循环期间加载,并查询数据库以从用户表中返回用户。我将查找为单个请求禁用延迟加载并尝试一下。谢谢。
  • @GertArnold 感谢您的建议。我最终并没有特别禁用延迟加载,但它确实引导我走上了一条产生预期结果的道路。我如何感谢您帮助我找到答案?
  • 没关系。如果您能分享自己问题的答案,那就太好了。

标签: c# asp.net-mvc asp.net-mvc-4 linq-to-entities lazy-loading


【解决方案1】:

根据@GertArnold 的建议,我仔细查看了获取用户集合的主查询,并尝试查看是否可以禁用延迟加载。因为我使用的是通用存储库模式和工作单元,所以我无法仅为该调用专门禁用它,所以我最终直接使用上下文并且一切都正常运行而无需禁用 - 这打破了我的模式,但我现在可以使用投影并避免我的应用程序急切地加载不必要的数据列。

如果有人能指出我在通用存储库中实现投影的正确路径,我会非常高兴,但我现在可以接受这种替代解决方案。

这篇 msdn 文章也有帮助:https://msdn.microsoft.com/en-us/data/jj574232.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 2014-01-29
    相关资源
    最近更新 更多