2014-01-28 61 views
1

該視圖中的代碼是否確實進行了延遲加載,並且每次碰到數據庫?如果是這樣,是否有解決方案,我如何知道它是否碰到數據庫?帶有實體框架的ASp.NET MVC:視圖中的急切和延遲加載

@{ 
    int langId = ViewBag.LangId; 

    int i = 0; 
    foreach (var item in Model) 
    { 
     i++; 
     <tr class="@(i % 2 == 0 ? "even" : "odd")"> 
      <td> 
       @Html.DisplayFor(modelItem => item.AlbumsLocs.FirstOrDefault(b => b.LanguageId == langId).Title) 
      </td> 
     </tr> 
    } 
} 

和我的控制器代碼:

public ViewResult Index() 
    { 
     var moduleItems = db.Albums.Include(x => x.AlbumsLocs).Where(a => a.AlbumVocId == id).ToList(); 

     return View(moduleItems); 
    } 
+2

您應該使用針對實體框架的分析器,它可以向您顯示其生成的流量和查詢。 –

+1

您使用的是哪個數據庫? Microsoft SQL Server有一個內置的分析工具,可以顯示數據庫查詢的SQL文本。我懷疑其他數據庫可能有類似的工具。 –

+0

感謝您的幫助,但是您能否知道這個代碼是否每次都是在數據庫中? –

回答

1

沒有,也不會有偷懶因爲item.AlbumsLocs將被標記爲已加載。所以FirstOrDefault()不會觸發新的加載嘗試。並且你顯示一個原始屬性(我認爲它是Title),所以這不會加載引用。您可以通過監視SQL語句輕鬆驗證此情況。

但是,即使您在這裏確定,一般情況下您應該儘量避免視圖中可能觸發延遲加載的構造。例如,當你忘記Include時,延遲加載將成爲一個問題,並且該視圖的可擴展性要小得多。

所以我會帶來更多的基本數據的視圖:

db.Albums.Where(a => a.AlbumVocId == id) 
     .Select(a => a.AlbumsLocs.FirstOrDefault(b => b.LanguageId == langId) 
         .Title) 

(你應該在控制器langId可用的爲好)。

當視圖變得更復雜時,使用視圖模型,以便完全控制從數據庫中提取數據的時間和位置。

這也將視圖數據從視圖形成到其所屬控制器的責任。 (或者在服務中,但不在視圖中)。

0

它可能會也可能不會,視型號而定。

找出,使用SQL事件探查器和運行視圖時監視請求,你會發現它是否使用延遲加載。

要解決這個問題,你將不得不包括在視圖上使用的模型的每個屬性。

+0

感謝您的幫助,生病嘗試,但如果您注意到我的控制器中的代碼,我包含「AlbumsLocs」以防止延遲加載,但我需要在我的視圖中表達以獲得特定元素,我想要的,那全是 –

+0

它可能是導致它的另一個屬性,甚至可能是「AlbumsLocs」中的一個屬性 –

1

您可以使用System.Diagnostics.Trace類查看您的LINQ正在生成的查詢。在調試這個加入,無論你使用的DbContext並調用控制器方法:

#if DEBUG 
      YourDbContext.Database.Log = x => Trace.WriteLine(x); 
#endif 

生成的SQL將顯示在輸出窗口在Visual Studio中2012

相關問題