Entity Framework 是在未访问导航属性时延迟加载相关实体
Entity Framework is lazy loading related entities when nav properties are not accessed
我正在尝试使用 EF 5 (4.4) 调试旧版 MVC 应用程序的性能问题。 SQL Server Profiler 揭示了 运行 比应有的更多查询。 EF 似乎正在为所讨论模型的每个相关实体生成查询。
现在这听起来像是延迟加载。问题是,代码中的任何地方都没有引用导航属性(至少没有明确引用)。
当我关闭上下文的延迟加载时,它修复了它。此外,如果我 return 模型以外的东西(例如视图模型),它会修复它。这是一个旧的、实现不佳的 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
我发现 Glimpse (a really useful diagnostic tool for ASP.NET) was accessing navigation properties for its Metadata tab (see my 结果是相关的)。直到当我禁用延迟加载并检查调用堆栈时我才发现它来自 Glimpse。由于 EF 模型直接传递给视图而不是视图模型,因此当它填充元数据时,它正在访问导航属性,从而导致数据库查询。当我禁用 Glimpse 的元数据选项卡时,问题就解决了。
无需任何第三方使用,您可以通过匿名对象实现。
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 ?.代码});
return Json(jsonData, JsonRequestBehavior.AllowGet);
希望现在一切都好
我正在尝试使用 EF 5 (4.4) 调试旧版 MVC 应用程序的性能问题。 SQL Server Profiler 揭示了 运行 比应有的更多查询。 EF 似乎正在为所讨论模型的每个相关实体生成查询。
现在这听起来像是延迟加载。问题是,代码中的任何地方都没有引用导航属性(至少没有明确引用)。
当我关闭上下文的延迟加载时,它修复了它。此外,如果我 return 模型以外的东西(例如视图模型),它会修复它。这是一个旧的、实现不佳的 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
我发现 Glimpse (a really useful diagnostic tool for ASP.NET) was accessing navigation properties for its Metadata tab (see my
无需任何第三方使用,您可以通过匿名对象实现。
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 ?.代码});
return Json(jsonData, JsonRequestBehavior.AllowGet);
希望现在一切都好