[英]Entity Framework 4 ObjectContext Lifetime
我剛剛開始將EF4與存儲庫模式一起使用。 我必須在每次使用上下文后調用dispose方法,或者在using塊中包裝代碼。 我可以使用ObjectContext而不用在我編寫的每個方法中都這樣做嗎,還是在存儲庫中有更好的方法來處理此問題?
另外,我也不想從UI將ObjectContext傳遞到存儲庫。
為了在沒有依賴注入的情況下盡可能有效地做到這一點,我建議您為對象上下文實現一個私有的延遲加載屬性。
private ObjectContext _context;
private ObjectContext Context
{ get
{
return _context ?? (_context = new ObjectContext());
}
}
接下來,使您的存儲庫實現IDisposable
並在dispose方法中處理對象上下文:
public Repository : IDisposable
{
...
public void Dispose()
{
_context.Dispose();
}
}
然后,只需在所有方法中使用該屬性,然后在using
語句中包裝存儲庫的用法即可。
為了減少到數據庫的流量,您還可以考慮將保存保存到存儲庫上的另一個方法中,該方法將調用轉發到對象上下文。 這樣,你得到時,數據被保存在用戶界面層的更多控制,即使你不用管怎么樣 。 那意味着你可以做
using (var repo = new Repository())
{
repo.AddSomeStuff("this", "is", true);
repo.ChangeSomethingElse("yes, please");
repo.Save();
}
從EF到數據庫只有一個調用。 另一方面,如果您這樣做
using (var repo = new Repository())
{
repo.AddSomeStuff("this", "is", true);
repo.ChangeSomethingElse("yes, please");
}
沒有任何反應,這可能會造成混淆。
使用對象上下文的一般模式是:
public BusinessObject GetSomething(){
using (MyObjectContext context = new MyObjectContext()){
//..do fun stuff
}
}
希望是您正在使用的模式。 當您僅可以使用“ using”語句時,調用dispose似乎有點過大。
另一個選擇是,如果您要在一個流中進行多個數據庫查詢。 我已經看到了一種模式,您可以在線程中重用相同的上下文。 人們基本上實現了基於線程的單例模式並傳遞上下文。 這樣做的好處是不必重建上下文以及一些內存緩存。 缺點是您可能會遇到並發問題。 有人更新了您在EF內部緩存的內容。
我猜第二種情況並不適用,因為聽起來您正在編寫一個小型應用程序。 (該語句基於您關於從UI傳遞上下文的評論...這會嚇到任何好的代碼架構師)。
如果您對基於線程的單例感興趣。 首先了解Singleton模式,然后查看有關“ DataContext”線程的博客 。 您將必須將“ DataContext”類型更改為ObjectContext類,但是它將起作用。
編輯
我會說我忽略了一個顯而易見的解決方案,那就是以下;)。 僅使用基於屬性的對象上下文並在using語句中播放存儲庫。 與上面的使用示例相同,但是您將實現IDisoposable。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.