遇到唯一的密钥冲突后无法重新插入

时间:2019-06-11 07:58:24

标签: entity-framework-core ef-core-2.1

我有以下情况:

使用EF Core2的业务逻辑功能检查记录是否已存在。如果该记录不存在,则会将其插入数据库中。

我有多个线程调用此业务逻辑功能。会发生什么:

如果同时使用相同的参数调用该函数,则两个实例都会检查记录是否存在-并且不存在。因此,两个实例都插入相同的记录。

第一次调用context.SaveChanges()时,一切正常。但是第二个SaveChanges()抛出异常,因为记录已经存在(数据库中存在唯一索引)。

如果我捕获到该异常并尝试使用UNIQUE_KEY的新值插入,由于先前添加的实体仍然在轨道中,因此它仍会引发异常。

如何实现此功能以避免异常?

1 个答案:

答案 0 :(得分:0)

您可以修改导致异常的现有实体,而不是简单地在catch块内添加新实体。

foreach (var entry in _dbContext.ChangeTracker.Entries<YourEntity>().Where(e => e.State == EntityState.Added)))
{
    entry.Entity.YourProperty = newvalue;
}

只需遍历给定类型的所有实体并更新具有唯一约束的属性即可。