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