Har*_*per 36 c# datacontext concurrency thread-safety entity-framework-4
实体框架生成的上下文对象不是线程安全的.
如果我使用两个独立的实体上下文,每个线程一个(并SaveChanges()在每个上调用),这会是线程安全的吗?
// this method is called from several threads concurrently
public void IncrementProperty()
{
   var context = new MyEntities();
   context.SomeObject.SomeIntProperty++;
   context.SaveChanges();
}
我相信实体框架上下文实现了某种"计数器"变量,它跟踪上下文中的当前值是否是新鲜的.
Jim*_*eri 41
更多的是,在单个Entity Framework上下文上运行的一个线程不是线程安全的.
每个线程的单独上下文实例是线程安全的.只要每个执行线程都有自己的EF上下文实例,你就可以了.
在您的示例中,您可以同时从任意数量的线程调用该代码,并且每个线程都将愉快地使用其自己的上下文.
但是,我建议为此实现"使用"块,如下所示:
// this method is called from several threads concurrently
public void IncrementProperty()
{
   using (var context = new MyEntities())
   {
      context.SomeObject.SomeIntProperty++;
      context.SaveChanges();
   }
}