c# - 更新范围返回 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
实体。这些属性设置为.IDs
TDomain[] domains
domains
State
Unchanged
我的问题是如何找到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
呢?
解决方案
在GetList
我添加的方法上:
AsNoTracking()
之前ToList()
,一切都开始正常工作