考虑这种情况:
存储库:
public void Save(object entity) {
lock (static object) {
context.Add(entity);
context.SaveChanges();
}
}
申请表:
//somewhere
new Thread(() => Repository.Save(entity)).Start()
//...
这种“行动”多次发生。在保存操作期间,db上下文会随机引发AccessViolationException
(尽管try-catch为o.0,仍会出现未处理的异常)。
我已经读过,这种异常可能是由对上下文对象的并发访问引起的。
问题是:为什么我的情况会发生这种异常?请注意,锁应确保线程安全访问。我该如何解决这个问题?
我有一个想法......我认为context.SaveChanges
不是“阻止”。当一个线程提交保存时,另一个线程进入Save
方法导致并发访问...
答案 0 :(得分:1)
您正在使用DbContext
听起来错误,并且随着应用程序的增长,将不可避免地导致问题。 EntityFramework
DbContext
被设计为Unit of Work。创建它,使用它,处理它;并且绝对不会在不同的线程上开始用它做事。一个事务不能同时跨越多个线程 - 它只是不能(或者即使有一些时髦的方式来处理它,它也不应该),每个线程都会获得它自己的事务。
你需要重做一些事情,以便每当你使用DbContext
时,你都可以这样做:
using (var context = new MyContext())
{
// 1. get entities
// 2. work with entities
// 3. save changes
}
// ALL IN A SINGLE THREAD
EntityFramework
本身并不会阻止你以其他方式工作,但是当你开始发现某些东西会以难以诊断的方式破解时。