我正在将使用 EF Core 2.2 的 ASP.NET Core 2.2 应用程序迁移到 ASP.NET Core 3.0 和 EF Core 3.0。
在一种特定方法中,后端从前端接收 DTO,并使用 Automapper 将其转换为等效的实体类型,将其附加到 DbContext 并保存。这在 EF Core 2.2 上完美运行,但在 EF Core 3.0 上失败并显示以下消息:
The instance of entity type 'ServiceProvider' cannot be tracked because another
instance with the same key value for {'Id'} is already being tracked
这是有问题的代码:
var sqresponse = _mapper.Map<SurveyQuestionResponse>(sqresponseDTO);
_context.Attach(sqresponse); // <=== Throws exception
_context.SaveChanges();
以下是具有相关类的实体:
public class SurveyQuestionResponse
{
public int? Id { get; set; }
public List<Answer> Answers { get; set; } = new List<Answer>();
}
public class Answer
{
public int? Id { get; set; }
public int SurveyQuestionResponseId { get; set; }
public ServiceProvider ServiceProvider { get; set; }
}
从前端传递给该方法的数据有两个Answer
,它们都包含一个ServiceProvider
with Id = 56
。
{
answers: [
{
// some more properties here
serviceProviderId: 56,
serviceProvider: { id: 56, name: "Foo" },
},
{
// some more properties here
serviceProviderId: 56,
serviceProvider: { id: 56, name: "Foo" },
}
]
}
这两个ServiceProvider
实体应该存在于数据库中;在这种情况下,我需要Answer
与现有ServiceProvider
实体相关联,{Id: 56}
这对于 EntityFramework Core 3.0 来说似乎是一个问题,但对于 EF Core 2.2 来说非常好。
我怀疑这与这个重大变化有关:DetectChanges 尊重商店生成的键值ServiceProvider
,但我认为提议的缓解将解决这个特定问题,但在尝试插入新实体时会创建另一个问题。我对么?
如何使它与 EF Core 3.0 一起使用?