首页 > 解决方案 > 更新范围返回 InvalidOperationException

问题描述

我想更新我的实体范围DbContext

var list = await repository.GetList(ids);
foreach (var entity in list)
{
        entity.IsSomething = true;
}

await repository.UpdateRange(list.ToArray());

...

public async Task UpdateRange(TDomain[] domains)
{
    DbSet.UpdateRange(domains); // exception on this line
    DbContext.SaveChangesAsync(CancellationToken.None)
}

当我跳转到DbSet.UpdateRange(domains)我的代码时,它会引发异常:

消息:无法跟踪实体类型“x”的实例,因为已经在跟踪具有与 {'Id'} 相同键值的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。System.InvalidOperationException:无法跟踪实体类型“x”的实例,因为已经在跟踪具有相同键值 {'Id'} 的另一个实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。

我向我添加了一些代码来Watch检查我的DbContext.

DbContext.ChangeTracker.Entries().ToList();

在我的条目中(DbSet.UpdateRange(domains);行前),有两个我经过的x实体。这些属性设置为.IDsTDomain[] domainsdomainsStateUnchanged

我的问题是如何找到DbContext因跟踪而阻止编辑的实体?似乎这里没有任何问题,但Entity Framework有不同的说法。

x实体配置:

var entityTypeBuilder = modelBuilder.Entity<x>();

entityTypeBuilder.HasOne(x => ...).WithOne().HasForeignKey<...>(x => ...);
entityTypeBuilder.HasOne(x => ...).WithOne().HasForeignKey<...>(x => ...);
entityTypeBuilder.HasMany(x => ...).WithOne(x => ...).HasForeignKey(x => ...);
entityTypeBuilder.HasMany(x => ...)
                 .WithOne()
                 .HasForeignKey(x => ...);
entityTypeBuilder.HasMany(x => ...);

也许子元素有问题,但为什么DbContext不显示出来ChangeTracker呢?

标签: c#entity-frameworkentity-framework-coreasp.net-core-2.1

解决方案


GetList我添加的方法上:

AsNoTracking()之前ToList(),一切都开始正常工作


推荐阅读