实体框架生成的上下文对象不是线程安全的。
如果我使用两个单独的实体上下文,每个线程一个(并调用SaveChanges()
每个) - 这是线程安全的吗?
// this method is called from several threads concurrently
public void IncrementProperty()
{
var context = new MyEntities();
context.SomeObject.SomeIntProperty++;
context.SaveChanges();
}
我相信实体框架上下文实现了某种“计数器”变量,它可以跟踪上下文中的当前值是否是新鲜的。
- 使用上面的代码 - 从单独的线程调用 - 我是否仍然需要锁定增量/保存更改?
- 如果是这样,在这个简单的场景中完成此任务的首选方法是什么?
在单个实体框架上下文上操作的多个线程不是线程安全的。
每个线程的单独上下文实例是线程安全的。只要每个执行线程都有自己的 EF 上下文实例,就可以了。
在您的示例中,您可以同时从任意数量的线程调用该代码,并且每个线程都会愉快地使用自己的上下文。
但是,我建议为此实现一个“using”块,如下所示:
// this method is called from several threads concurrently
public void IncrementProperty()
{
using (var context = new MyEntities())
{
context.SomeObject.SomeIntProperty++;
context.SaveChanges();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)