簡體   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