实体框架线程安全

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();
}
Run Code Online (Sandbox Code Playgroud)

我相信实体框架上下文实现了某种"计数器"变量,它跟踪上下文中的当前值是否是新鲜的.

  1. 使用上面的代码 - 从单独的线程调用 - 我是否还需要锁定增量/保存更改?
  2. 如果是这样,在这个简单的场景中实现这一目标的首选方法是什么?

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要实现乐观并发或数据库事务来处理数据库并发问题。 (2认同)