带有SQL Server Compact的C#Entity Framework 6。保存更改时的AccessViolationException

时间:2014-04-26 07:18:17

标签: c# sql entity-framework sql-server-ce access-violation

考虑这种情况:

存储库:

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方法导致并发访问...

1 个答案:

答案 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本身并不会阻止你以其他方式工作,但是当你开始发现某些东西会以难以诊断的方式破解时。