我在 asp.net core 2.0 中使用通用存储库模式,它无法处置存储库对象,当我要更新条目时,它已成功更新一次,但当我尝试更新更多时,它会抛出以下异常:
无法跟踪实体类型“Company”的实例,因为已跟踪具有相同键值 {'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;
}
}
您的数据库上下文正在由多个请求共享,这意味着您正在编辑的实体已被跟踪。
这可能是因为您的存储库服务是单例而不是作用域,因此您的数据库上下文在拉出时与正在跟踪的实体一起重用,然后放回到数据库上下文的同一实例中。
使用单例存储库代替范围存储库,这意味着将为每个请求创建一个新实例。同样,您还将拥有一个每个请求的数据库上下文。
当您注册服务时,它将使用services.AddSingleton<..>
将此更改为services.AddScoped<..>
,当您将其注入控制器时,您将根据请求获得一个新实例,并且您的更新应该可以正常工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)