我在asp.net core 2.0中使用通用存储库模式,它无法处理存储库对象,当我要更新条目时,它已成功更新一次,但是当我尝试更新更多时,它会抛出以下异常:
无法跟踪实体类型“公司”的实例,因为已经跟踪了另一个具有{'ID'}相同键值的实例。附加现有实体时,请确保仅附加具有给定键值的一个实体实例。考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'来查看冲突的键值。
public ActionResult Edit(Int64 id, Company collection)
{
try
{
// TODO: Add update logic here
interfaceobj.updateModel(collection);
interfaceobj.Save();
return RedirectToAction(nameof(Index));
}
catch(Exception ex)
{
throw ex;
}
}
您的数据库上下文由多个请求共享,这意味着您正在编辑的实体已被跟踪。
这可能是因为您的存储库服务是Singleton而不是Scoped,因此您的数据库上下文在被拔出时被跟踪的实体重用,然后返回到DB Context的同一实例。
你应该做的是拥有一个Scoped Repository,这意味着将为每个请求创建一个新实例。同样,您还将拥有每请求数据库上下文。
当您注册您的服务时,它将使用services.AddSingleton<..>
将此更改为services.AddScoped<..>
,当您将其注入控制器时,您将获得每个请求的新实例,并且您的更新应该可以正常工作。
也许它可以帮助你:
services.AddDbContext<...>(ServiceLifetime.Singleton);