gpt4 book ai didi

c# - EF4.1 + MARS - 更新时不允许新事务

转载 作者:行者123 更新时间:2023-11-30 16:27:26 27 4
gpt4 key购买 nike

更新数据库中的实体时出现以下异常:

New transaction is not allowed because there are other threads running in the session.

我使用相同的代码块来处理所有传入数据(从 Excel 工作簿中抓取)。工作 INSERT 和不工作 UPDATE 之间的唯一区别如下:

public void UploadWorkbook(Workbook workbook, string uploadedBy, string comments)
{
workbook.UploadedBy = uploadedBy;
workbook.Comments = comments;

var existing = _repository.Get(x => x.FileName == workbook.FileName);
if (existing == null)
_repository.Insert(workbook); // this works on the commit
else
_repository.Update(workbook); // this causes commit to fail

_unitOfWork.Commit(); // fails when repository runs update method
}

此外,这是更新方法:

public override void Update(Workbook entity)
{
var existing = Get(x => x.FileName == entity.FileName);

if (existing == null)
{
var message = string.Format(@"Error :: Cannot update Workbook '{0}'
because it does not exist in the database.",
entity.FileName);

throw new Exception(message);
}

existing.Version = entity.Version;
existing.DateModified = DateTime.Now;
existing.Comments = entity.Comments;
existing.FilePath = entity.FilePath;

if (existing.Data != null)
existing.Data.Clear();

existing.Data = entity.Data;
}

下面是 Get 方法的实现:

public virtual T Get(Func<T, bool> where)
{
return _dbSet.Where(where).FirstOrDefault();
}

我在这里查看了一些关于类似问题的其他帖子,但与我遇到的情况完全不同。我真的被困在这里,因为我无法理解 INSERT 是如何工作的,但是 UPDATE 失败了。如果有另一个事务正在进行,不会导致任何一个操作失败吗?

最佳答案

我的第一个怀疑是您的 Get 调用

Get(x => x.FileName == entity.FileName);

隐式创建一个新的线程/事务,该线程/事务在提交工作单元之前未关闭。然后你的工作单元试图在提交调用中创建一个全新的事务,这与已经打开的 Get() 事务冲突。

如果是这种情况,那么您可能想弄清楚如何让您的 Get 调用与您的提交调用在同一事务中运行。

编辑:

我相信你可以通过简单的改变来解决你的问题

public virtual T Get(Func<T, bool> where)
{
return _dbSet.Where(where).FirstOrDefault();
}

public virtual T Get(Func<T, bool> where)
{
return _dbSet.Where(where).SingleOrDefault();
}

SingleOrDefault() 应该强制序列完成“读取”并为提交事务释放连接。 (一开始它也可能更安全,因为如果您的查询返回了多个结果,则 FirstOrDefault() 并不清楚您实际会得到哪条记录,因为没有指定顺序。使用SingleOrDefault() 将在返回多于一行的情况下抛出异常)

或者您可以尝试明确的事务范围:

public void UploadWorkbook(Workbook workbook, string uploadedBy, string comments)
{
workbook.UploadedBy = uploadedBy;
workbook.Comments = comments;

using (var transaction = new TransactionScope())
{
var existing = _repository.Get(x => x.FileName == workbook.FileName);
if (existing == null)
_repository.Insert(workbook); // this works on the commit
else
_repository.Update(workbook); // this causes commit to fail

_unitOfWork.Commit(); // fails when repository runs update method
transaction.Complete();
}
}

(另见 Microsoft Connect page on this error message)

关于c# - EF4.1 + MARS - 更新时不允许新事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7909093/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com