【问题标题】:Entity Framework is lazy loading related entities when nav properties are not accessed实体框架在不访问导航属性时延迟加载相关实体
【发布时间】:2015-02-19 00:09:58
【问题描述】:

我正在尝试使用 EF 5 (4.4) 调试旧 MVC 应用程序的性能问题。 SQL Server Profiler 揭示了正在运行的查询多于应有的方式。 EF 似乎正在为相关模型的每个相关实体生成查询。

现在这听起来像是延迟加载。问题是,代码中的任何地方都没有引用导航属性(至少没有明确地)。

当我为上下文关闭延迟加载时,它会修复它。此外,如果我返回模型以外的东西(例如视图模型),它会修复它。这是一个旧的、执行不力的 MVC 应用程序——无论如何它都应该使用视图模型,所以这很好。这些都是可以接受的修复,但我仍然想知道为什么会发生这种情况。


我已经读过,当对象被序列化时,导航属性可能会被调用。这就是这里发生的事情吗?如果是这样,您能解释为什么要序列化对象吗? (注意我对序列化的理解非常基础——基本上就是here所说的。)


这是一个例子:

控制器

    [HttpGet]
    public ViewResult StoreInfo(int id)
    {
        Store model = _posRepository.GetStore(id);

        return View(model);
    }

存储库

    public Store GetStore(int storeID)
    {
        return _dbContext.Store.Single(x => x.StoreID == storeID);
    }

型号

public partial class Store // highly simplified version
{           
    public int StoreID { get; set; }        
    public string StoreName { get; set; }        
    public Nullable<int> StateID { get; set; }          

    public virtual States State { get; set; } // lazy loaded
}

查看

// blank

【问题讨论】:

  • 这里没有序列化。当您将模型传递给查看时,它会将其作为对象传递。它不做任何序列化。只有当你使用Json(model)时它才会序列化它,所以问题出在其他地方
  • 感谢您提供的信息 - 我不确定框架是否在幕后进行操作。
  • 就像另一个示例 - dotnetfiddle.net/T9fYud 。在这里,我使用了相同的模型,但没有 EF。它在内部使用 MVC4。它在属性访问器中有Console.WriteLine 调用。它写入 dotnetfiddle 的底部,如您所见 - 在视图渲染期间未访问 State 属性

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


【解决方案1】:

我发现Glimpse(一个非常有用的 ASP.NET 诊断工具)正在访问其元数据选项卡的导航属性(请参阅我的other question,结果证明是相关的)。直到我在禁用延迟加载时在导航属性上引发了 NullReferenceException,并检查了调用堆栈,才发现它来自 Glimpse。由于 EF 模型直接传递给视图而不是视图模型,因此当它填充元数据时,它正在访问导航属性,从而导致数据库查询。当我禁用 Glimpse 的元数据选项卡时,它解决了问题。

【讨论】:

    【解决方案2】:

    无需任何第三方使用,您可以通过匿名对象来实现。

    var dataList= _dbContext.Store.Single(x => x.StoreID == storeID); var jsonData= dataList.Select(c=> new {c.StoreID, c.StoreName, c.StateID, StateName=c.State?.Name, StateCode=c.State?.Code});

    return Json(jsonData, JsonRequestBehavior.AllowGet);

    希望现在一切都好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2015-12-13
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多