[英]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();
}
我相信實體框架上下文實現了某種“計數器”變量,該變量可以跟蹤上下文中的當前值是否新鮮。
在單個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.