這里記錄一個在使用.net core中ef core執行數據庫操作時遇到的問題:
我在代碼中使用DbContext下的Update方法准備將更改后的數據像這樣步到數據庫:
_context.Menus.Update(menu);
這是很常見的用法,但沒想到一直報如下錯誤:
The instance of entity type 'Menu' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.
使用谷歌翻譯翻譯為:
無法跟蹤實體類型“Menus”的實例,因為已經跟蹤了具有相同鍵值的{'Id'}的另一個實例。
我的代碼如下:
if (!menu.OrderNumber.HasValue) { var maxOrderItem = _context.Menus.Where(x => x.ParentId == menu.ParentId) .OrderByDescending(x => x.OrderNumber) .FirstOrDefault(); menu.OrderNumber = maxOrderItem != null ? maxOrderItem.OrderNumber + 1 : 999; } ///EF core中沒有AddOrUpdate方法,所以針對是新增菜單還是修改菜單做出判斷 if (isNewMenu) { _context.Menus.Add(menu); } else { _context.Menus.Update(menu);///此處報出上述異常 } _context.SaveChanges();
我通過百度,發現國內網站上沒有出現類似錯誤的記載,最后,我在stackoverflow上看到一段類似問題描述:
該用戶描述,他進行了如下嘗試:
在使用_context獲取值時,使用AsNoTracking()方法,我進行嘗試,修改我的代碼如下:
if (!menu.OrderNumber.HasValue) { var maxOrderItem = _context.Menus.AsNoTracking().Where(x => x.ParentId == menu.ParentId) .OrderByDescending(x => x.OrderNumber) .FirstOrDefault(); menu.OrderNumber = maxOrderItem != null ? maxOrderItem.OrderNumber + 1 : 999; } ///EF core中沒有AddOrUpdate方法,所以針對是新增菜單還是修改菜單做出判斷 if (isNewMenu) { _context.Menus.Add(menu); } else { _context.Menus.Update(menu); } _context.SaveChanges();
發現我遇到的這個問題得以圓滿解決。
我在這里記錄一下這個問題,但其中的道理我沒有深究,就不說了。