带有SQL Server Compact的C#实体框架6.保存更改时出现AccessViolationException

本文关键字:保存更改 AccessViolationException 框架 实体 Server SQL Compact 带有 | 更新日期: 2023-09-27 18:00:10

考虑这个场景:

存储库:

public void Save(object entity) {
    lock (static object) {
        context.Add(entity);
        context.SaveChanges();
    }
}

应用程序:

//somewhere
new Thread(() => Repository.Save(entity)).Start()
//...

这种"动作"发生多次。在保存操作期间,数据库上下文随机引发一个AccessViolationException(尽管try-catch为o.0,但未处理的异常)

我已经读到这种异常可能是由对上下文对象的并发访问引起的。

问题是:为什么在我的情况下会出现这种例外情况?请注意,锁应确保线程安全访问。我该如何解决这个问题?

我有个主意。。。我认为context.SaveChanges不是"阻塞"。当一个线程提交时,另一个线程在Save方法中输入的保存会导致并发访问。。。

带有SQL Server Compact的C#实体框架6.保存更改时出现AccessViolationException

您对DbContext所做的操作听起来是错误的,并且随着应用程序的增长,不可避免地会导致问题。EntityFramework DbContext被设计为一个工作单元。创造它,使用它,处置它;绝对不要在不同的线程上使用它。一个事务不能同时跨越多个线程——它就是不能(或者即使有一些奇怪的方法可以欺骗它,它也不应该),每个线程都有自己的事务。

你需要返工,这样无论何时使用DbContext,你都可以按以下方式进行:

using (var context = new MyContext())
{
   // 1. get entities
   // 2. work with entities
   // 3. save changes
}
// ALL IN A SINGLE THREAD

EntityFramework本身不会阻止你以其他方式工作,但当你开始发现在某个时候,事情会以一种难以诊断的方式破裂。