c# - Entity Framework 线程安全

标签 c# concurrency entity-framework-4 thread-safety datacontext

Entity Framework 生成的上下文对象不是线程安全的。

如果我使用两个单独的实体上下文,每个线程一个(并在每个线程上调用 SaveChanges())会怎么样 - 这会是线程安全的吗?

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

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

我相信 Entity Framework 上下文实现了某种“计数器”变量,它跟踪上下文中的当前值是否新鲜。

  1. 使用上面的代码 - 从单独的线程调用 - 我是否仍然需要锁定增量/保存更改?
  2. 如果是这样,在这个简单的场景中完成此任务的首选方法是什么?

最佳答案

在单个 Entity Framework 上下文上运行的多个线程不是线程安全的。

每个线程的单独上下文实例是线程安全的。只要每个执行线程都有自己的 EF 上下文实例,就可以了。

在您的示例中,您可以同时从任意数量的线程调用该代码,并且每个线程都会愉快地使用自己的上下文。

但是,我建议为此实现一个“using” block ,如下所示:

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

关于c# - Entity Framework 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455634/

相关文章:

java - OO 设计与 Java 中的静态类以及并发开发

multithreading - 非阻塞并发消息接收

c# - 如何从多对多关系中检索实体列表?

c# - 在 C# 中引用处置的对象

c# - 将对象转换为 IEnumerable<object>?

c# - 数组值没有改变?

c# - HttpWebRequest 端口耗尽

sql - 将数据库表用作作业队列(也称为批处理队列或消息队列)的最佳方式

c# - SQL 超时异常 : Due to a connection issue? 或查询/命令耗时过长?

entity-framework-4 - 一个或多个实体的验证失败