.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
之前,实体状态是分离的(或者是因为它在事务内部,调试器无法看到它?)