[英]The instance of entity type Menu cannot be tracked
我開始了一個新的 asp.net 核心項目。 如您所知,Core 2.1 版具有依賴注入。
我有一個名為 MenuModel 的 model 來在我的數據庫中創建一個表。 我為我的 model 添加了一個名為 IMenuRepository 的接口,並為實現我的接口的 class 調用 MenuRepository 添加了一個接口。
我嘗試像這樣在我的存儲庫中編輯我的菜單
public async Task Edit(Menu menu)
{
menu.UpdatedBy = _userId;
menu.UpdatedDate = DateTime.Now;
_db.Entry(menu).State = EntityState.Modified;
await _db.SaveChangesAsync();
}
我將這行代碼添加到我的 startup.cs 中以進行依賴注入
services.AddTransient<IMenuRepository, MenuRepository>();
我發現另一個問同樣問題的問題,答案說我必須更改我的 startup.cs 代碼,例如:
services.AddScoped<IMenuRepository, MenuRepository>();
我做了,我也嘗試了其他的,但我總是得到這個錯誤。 我搜索了幾次,但找不到任何解決問題的方法。
有一次我在編輯之前將 model 從我的 DatabaseContext 中分離出來,我也遇到了同樣的錯誤。
我嘗試使用此代碼進行更新,但沒有結果
_db.Update(menu);
這是我的錯誤描述:
**處理請求時發生未處理的異常。
InvalidOperationException:無法跟蹤實體類型“Menu”的實例,因為已經在跟蹤具有相同鍵值 {'MenuId'} 的另一個實例。 附加現有實體時,請確保僅附加一個具有給定鍵值的實體實例。 考慮使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”來查看沖突的鍵值。 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.ThrowIdentityConflict(InternalEntityEntry 條目)**
另一方面,我有一部分用於發布和取消發布菜單的代碼,它可以更改記錄狀態並像這樣編輯菜單,並且效果很好。
public async Task Publish(int id)
{
Menu menu = await Find(id);
menu.UpdatedBy = _userId;
menu.UpdatedDate = DateTime.Now;
menu.Status = eStatus.Published;
_db.Entry(menu).State = EntityState.Modified;
}
不同之處僅在於我將菜單 id 發送到發布方法,並將菜單 obj 發送到編輯。
在用不同的語言搜索后,我找到了我的問題的答案
我將編輯方法更改為:
public async Task Edit(Menu menu)
{
menu.UpdatedBy = _userId;
menu.UpdatedDate = DateTime.Now;
var editVersion = await Find(menu.MenuId);
if (editVersion != null)
{
_db.Entry(editVersion).CurrentValues.SetValues(menu);
}
await _db.SaveChangesAsync();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.