[英]EF Core 3.1 throw System.InvalidOperationException when saving entity graph in Disconnected scenario
我有一个断开连接的场景,我从数据库中提取数据,对其进行编辑并将其保存回来。
我使用两种方法,一种是获取数据,另一种是保存数据。
方法如下:
public async Task<IEnumerable<MasterObject>> GetDataAsync(int someId, CancellationToken ct)
{
await using var context = new dbContext(_connectionString);
return await context
.MasterObject
.Include(x => x.NavigationOne)
.Include(x => x.NawigationTwo)
.Include(x => x.NavigationThree)
.ThenInclude(x => x.SubNavigation)
.Where(x => x.NavigationOne.SomeId == someId)
.AsNoTracking()
.ToListAsync(ct)
.ConfigureAwait(false);
}
public async Task SaveMasterObjectAsync(MasterObject masterObject)
{
await using var context = new dbContext(_connectionString);
context.DailyPlan.Update(masterObject);
await context.SaveChangesAsync().ConfigureAwait(false);
}
每次我调用GetDataAsync
方法并想要保存返回的条目之一时,都会收到错误消息:
System.InvalidOperationException
无法跟踪实体类型“SubNavigation”的实例,因为已经在跟踪具有相同键值 {'SubNavigation'} 的另一个实例。 附加现有实体时,请确保仅附加一个具有给定键值的实体实例。 考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
您可以在更新之前清除EF Core中的跟踪实体
public async Task SaveMasterObjectAsync(MasterObject masterObject)
{
await using var context = new dbContext(_connectionString);
var changedEntries = context.ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added ||
e.State == EntityState.Modified ||
e.State == EntityState.Deleted)
.ToList();
foreach (var entry in changedEntries)
entry.State = EntityState.Detached;
context.DailyPlan.Update(masterObject);
await context.SaveChangesAsync();
}
好的,我发现问题出在哪里。 在我的 ViewModel 中,我有两个列表,一个包含所有实体,第二个用于过滤第一个列表并通过 Binding 显示到 DataGrid。 当我将实体直接加载到第二个列表时,换句话说 DataGrid 是直接绑定到保存数据的列表,然后我可以执行 Save 方法。
另一个发现是,当 UI 运行时,就会出现问题。 当我在 UI 初始化之前强制运行方法时,一切正常。
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.