首页 文章

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

提问于
浏览
0

我在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;
    }
}

2 回答

  • 0

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

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

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

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

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

  • 8

    也许它可以帮助你:

    services.AddDbContext<...>(ServiceLifetime.Singleton);
    

相关问题