.net core EF核心更新仅在事务内引发异常
我使用的是.net core EF核心更新仅在事务内引发异常,.net-core,transactions,sql-update,entity-framework-core,.net Core,Transactions,Sql Update,Entity Framework Core,我使用的是EF Core,我不理解以下内容。我使用的是典型的更新方法,无论我在事务中使用它,我都会得到以下异常: System.InvalidOperationException:'实体类型的实例 无法跟踪“SegmentModel”,因为另一个实例具有 正在跟踪{'Id'}的相同键值。连接时 现有实体,请确保只有一个实体实例具有给定的 随附关键值。考虑使用 “DbContextOptions Builder.EnableSensivedAtalogging”以查看 相互冲突的键值。” 更新方法
EF Core
,我不理解以下内容。我使用的是典型的更新方法,无论我在事务中使用它,我都会得到以下异常:
System.InvalidOperationException:'实体类型的实例
无法跟踪“SegmentModel”,因为另一个实例具有
正在跟踪{'Id'}的相同键值。连接时
现有实体,请确保只有一个实体实例具有给定的
随附关键值。考虑使用
“DbContextOptions Builder.EnableSensivedAtalogging”以查看
相互冲突的键值。”
更新方法:
public void Update(T entity) { //Generic type
var entry = this.context.Entry(entity); //specific DBContext
if (entry.State == EntityState.Detached) {
var attched = this.table.Attach(entity);
}
context.Entry(entity).State = EntityState.Modified;
}
如果我单独调用此方法,则更新会起作用。但是,当我在事务中使用它时:
private async Task UpdateInTransaction(int id)
{
var entry=this.repo.GetById(id);
using(IDbContextTransaction tran=this.repo.BeginTransactionAsync()) //returns a
{
//delete some entries
this.repo.Update(entry);
}
}
有趣的是,在我插入GetById
之前,这个方法一直有效。在调用Update
之前,这是唯一涉及我的目标条目的方法。在这两种情况下(正常更新和事务内),我都检查了条目在更新之前的状态,并且该状态同时处于分离状态
为什么更新会在这种情况下抛出
更新
据我所知,问题源于这样一个事实,即首先使用GetById
从数据库中提取目标实体,因此其状态为Attached
。然后,当我输入事务
和我更新
时,我再次尝试附加它,因此失败。
我可以同意这一点,但当我使用调试器检查GetById
之后但更新之前的实体状态时,它的状态是分离的
。因此,即使我附加它,它也应该工作。
问题出在哪里?这是因为同一实体被附加到上下文两次。
第一个是执行GetById,第二个是调用update方法
在更新方法中,不需要再次附加实体,因为它已经是了。问题是,我在仅更新实体时和在该事务中都使用了相同的方法Update
。我是否无法调整我的Update
方法以适应这两种场景?在第二种场景中调用Update
之前,实体状态是分离的(或者是因为它在事务内部,调试器无法看到它?)