The instance of entity type 'Menu' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.


這里記錄一個在使用.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();

 

發現我遇到的這個問題得以圓滿解決。

我在這里記錄一下這個問題,但其中的道理我沒有深究,就不說了。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM