C# 无法跟踪实体类型菜单的实例

C# 无法跟踪实体类型菜单的实例,c#,asp.net-mvc,entity-framework,asp.net-core,dependency-injection,C#,Asp.net Mvc,Entity Framework,Asp.net Core,Dependency Injection,我开始了一个新的asp.net核心项目。正如您所知,在核心版本2.1中有依赖项注入 我有一个名为MenuModel的模型来在数据库中创建表。我为我的模型添加了一个名为IMenuePository的接口和一个实现我的接口的类调用MenuRepository 我试着像这样在我的存储库中编辑我的菜单 public async Task Edit(Menu menu) { menu.UpdatedBy = _userId; menu.UpdatedDate

我开始了一个新的asp.net核心项目。正如您所知,在核心版本2.1中有依赖项注入

我有一个名为MenuModel的模型来在数据库中创建表。我为我的模型添加了一个名为IMenuePository的接口和一个实现我的接口的类调用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>();
以下是我的错误描述:

**处理请求时发生未处理的异常

InvalidOperationException:无法跟踪实体类型“Menu”的实例,因为已在跟踪另一个具有{MenuId}相同键值的实例。附着现有实体时,请确保仅附着一个具有给定键值的实体实例。考虑使用“dBraveTopStudioBuff.EnabelSythViDeAtGracg”来查看冲突的键值。 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.ThroWideTityConflict(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发送到publish方法,并将菜单obj发送到edit。

用不同的语言搜索后,我找到了问题的答案

我将编辑方法更改为:

    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();
    }
    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;
    }
    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();
    }