簡體   English   中英

實體框架4 ObjectContext生存期

[英]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.

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