首页 > 解决方案 > 唯一键违规后无法重新插入

问题描述

我有以下情况:

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

我有多个线程调用这个业务逻辑函数。会发生什么:

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

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

如果我捕获该异常并尝试使用新值插入UNIQUE_KEY,它仍然会引发异常,因为之前添加的实体仍在跟踪中。

如何实现这一点以避免异常?

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

解决方案


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

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

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


推荐阅读