繁体   English   中英

在断开连接的情况下保存实体图时,EF Core 3.1 抛出 System.InvalidOperationException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM