无法跟踪实体类型Menu的实例



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

我有一个名为MenuModel的模型来在数据库中创建一个表。我为我的模型添加了一个名为IMenuRepository的接口和一个实现接口的类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>();

我做到了,我也试过其他的,但我总是会犯这个错误。我找了几次,但都找不到解决问题的办法。

有一次,我在编辑之前将模型从DatabaseContext中分离出来,也出现了同样的错误。

我尝试用这个代码更新,但没有结果

_db.Update(menu);

以下是我的错误描述:

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

InvalidOperationException:无法跟踪实体类型"Menu"的实例,因为已在跟踪另一个具有{MenuId}相同键值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。请考虑使用"DbContextOptionsBuilder.EnableSentiveDataLogging"查看冲突的键值。Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.SthrowIdentityConflict(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();
}

最新更新