簡體   English   中英

實體框架線程安全

[英]Entity Framework Thread Safety

實體框架生成的上下文對象不是線程安全的。

如果我使用兩個單獨的實體上下文,每個線程一個(並在每個線程上調用SaveChanges() ,該怎么辦?它將是線程安全的嗎?

// this method is called from several threads concurrently
public void IncrementProperty()
{
   var context = new MyEntities();

   context.SomeObject.SomeIntProperty++;
   context.SaveChanges();
}

我相信實體框架上下文實現了某種“計數器”變量,該變量可以跟蹤上下文中的當前值是否新鮮。

  1. 使用上面的代碼(從單獨的線程調用),我是否仍需要鎖定增量/保存更改?
  2. 如果是這樣,在這種簡單情況下,實現此目標的首選方法是什么?

在單個Entity Framework上下文上運行的線程多於線程安全。

每個線程的單獨上下文實例是線程安全的。 只要每個執行線程都有其自己的EF上下文實例,就可以了。

在您的示例中,您可以同時從任意數量的線程中調用該代碼,並且每個線程都可以在自己的上下文中愉快地工作。

但是,我建議為此實現一個“ using”塊,如下所示:

// this method is called from several threads concurrently
public void IncrementProperty()
{
   using (var context = new MyEntities())
   {
      context.SomeObject.SomeIntProperty++;
      context.SaveChanges();
   }
}

我相信“ SomeObject.SomeIntProperty”是靜態的。 這與實體是線程安全的無關。 如果要在多線程環境中寫入靜態變量,則應始終使用雙重檢查鎖包裝它們以確保線程安全。

您可以使用工廠方法將DbContext作為工廠而不是實例本身注入,請看一下: https : //github.com/vany0114/EF.DbContextFactory

這樣更安全,並且避免將實例創建硬編碼到存儲庫中。

http://elvanydev.com/EF-DbContextFactory/

Ninject有一個擴展,以一種非常簡單的方式實現,只需調用方法kernel.AddDbContextFactory<YourContext>(); 您還需要通過接收Func<YourContext>來更改存儲庫

暫無
暫無

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

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