无法跟踪实体类型的实例,因为跟踪了具有相同键值的另一个实例

问题描述 投票:0回答:2

我在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;
    }
}
.net entity-framework .net-core asp.net-core-2.0
2个回答
8
投票

您的数据库上下文由多个请求共享,这意味着您正在编辑的实体已被跟踪。

这可能是因为您的存储库服务是Singleton而不是Scoped,因此您的数据库上下文在被拔出时被跟踪的实体重用,然后返回到DB Context的同一实例。

你应该做的是拥有一个Scoped Repository,这意味着将为每个请求创建一个新实例。同样,您还将拥有每请求数据库上下文。

当您注册您的服务时,它将使用services.AddSingleton<..>

将此更改为services.AddScoped<..>,当您将其注入控制器时,您将获得每个请求的新实例,并且您的更新应该可以正常工作。


0
投票

也许它可以帮助你:

services.AddDbContext<...>(ServiceLifetime.Singleton);
© www.soinside.com 2019 - 2024. All rights reserved.