簡體   English   中英

實體框架在未訪問導航屬性時延遲加載相關實體

[英]Entity Framework is lazy loading related entities when nav properties are not accessed

我正在嘗試使用 EF 5 (4.4) 調試舊 MVC 應用程序的性能問題。 SQL Server Profiler 揭示了正在運行的查詢比應有的多。 EF 似乎正在為相關模型的每個相關實體生成查詢。

現在這聽起來像是延遲加載。 問題是,在代碼中的任何地方都沒有引用導航屬性(至少沒有明確引用)。

當我為上下文關閉延遲加載時,它會修復它。 另外,如果我返回模型以外的東西(例如視圖模型),它會修復它。 這是一個舊的、實現不佳的 MVC 應用程序 - 無論如何它應該使用視圖模型,所以沒關系。 這些都是可以接受的修復,但我仍然想知道它為什么會發生。


我已經讀過,當對象被序列化時,導航屬性可能會被調用。 這就是這里發生的事情嗎? 如果是這樣,你能解釋為什么對象被序列化嗎? (注意我對序列化的理解是非常基礎的——基本上就是這里所說的。)


下面是一個例子:

控制器

    [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 (一個非常有用的 ASP.NET 診斷工具)正在訪問其元數據選項卡的導航屬性(請參閱我的另一個問題,結果證明是相關的)。 直到當我禁用延遲加載時,我在導航屬性上拋出了 NullReferenceException,並檢查了我發現它來自 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?.Code});

返回 Json(jsonData, JsonRequestBehavior.AllowGet);

希望現在一切都好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM