我正在将使用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
和Id = 56
。
{
answers: [
{
// some more properties here
serviceProviderId: 56,serviceProvider: { id: 56,name: "Foo" },},{
// some more properties here
serviceProviderId: 56,}
]
}
这两个ServiceProvider
实体是存在于数据库中的;在这种情况下,我需要将两个Answer
与具有ServiceProvider
的现有{Id: 56}
实体相关联
对于EntityFramework Core 3.0来说,这似乎是一个问题,但是对于EF Core 2.2来说,这是完全可以的。
我怀疑这与this breaking change: DetectChanges honors store-generated key values有关,但是我认为拟议的缓解措施将解决此特定问题,但在尝试插入新的ServiceProvider
实体时会创建另一个问题。我说得对吗?
如何使其与EF Core 3.0配合使用?