带有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
方法中输入的保存会导致并发访问。。。
您对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
本身不会阻止你以其他方式工作,但当你开始发现在某个时候,事情会以一种难以诊断的方式破裂。