簡體   English   中英

實體類型Menu的實例無法追蹤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM