2014-01-27 39 views
1

如果我的問題是正常的,我很抱歉。但我見面的時候我使用實體框架5.實體框架5:使用延遲加載或熱切加載

如果讓我選擇預先加載設計我的ASP.NET MVC 4.0應用這個問題,我只是簡化使用:

public Problem getProblemById(int id) { 
using(DBEntity ctx = new DBEntity()) 
      { 
       return (Problem) ctx.Posts.Find(id); 
      } 
} 

但是,如果使用預先加載,我會遇到問題:當我想瀏覽其所有屬性,如評論(問題),用戶(問題)......我必須手動使用Include來包含這些屬性。有時候,如果我不使用這些屬性,我會失去表現,也許我失去了實體框架的力量。

如果我使用Lazy Loading。有兩種方法可以使用DBContext對象。第一種方式是在本地使用的DbContext對象:

public Problem getProblemById(int id) { 
DBEntity ctx = new DBEntity(); 
return (Problem) ctx.Posts.Find(id); 
} 

利用這一點,我想會遇到內存泄漏,因爲CTX將永遠不會再處理。

第二種方法是使的DbContext對象的靜態和全球使用它:

static DBEntity ctx = new DBEntity(); 
public Problem getProblemById(int id) { 
return (Problem) ctx.Posts.Find(id); 
} 

我看了一些博客,他們說,如果我用這種方式,我必須控制併發訪問(因爲多請求發送到服務器)由我自己,OMG。例如此鏈接:

Entity Framework DBContext Usage

那麼,怎樣才能設計出我的應用程序,請幫我找出。

謝謝:)

回答

6

不要使用靜態DBContext對象。請參閱c# working with Entity Framework in a multi threaded server

ASP.Net MVC的簡單規則:使用每個用戶請求的DBContext實例。

至於使用延遲加載與否,我會說這取決於,但我個人會關閉延遲加載。國際海事組織這是一個的功能,因爲它存在的根本問題:

  • 實在太難處理異常,因爲SQL請求可以在你的代碼在任何地方失敗(不只是在DAL因爲如果不能很好地使用
  • 太容易寫斷碼產生SQL十萬一個開發者可以訪問導航屬性在任何一塊代碼)
  • 表現不佳請求
+0

因此,如果我使用延遲加載。我如何設計我的應用程序以使用DBContext對象?謝謝:) – hqt

+0

我看到很多帖子(包括MSDN鏈接),建議不要使用延遲加載。所以,爲什麼微軟仍然有這樣的選擇程序員:(他們不作任何改變,使其更容易使用:(): – hqt

+0

@hqt使用延遲加載或不會改變你使用DBContext本身的方式;你會仍然需要找到一種方法來爲每個用戶請求創建一個新的實例,一個簡單的方法是在每個控制器的構造函數中實例化DBContext,並將其傳遞給業務層,一種更健壯的方法是使用IoC框架自動請參閱http://www.codeproject.com/Articles/70061/Architecture-Guide-ASP-NET-MVC-Framework-plus-N-ti例如 – ken2k