我有以下情况:
使用EF Core2的业务逻辑功能检查记录是否已存在。如果该记录不存在,则会将其插入数据库中。
我有多个线程调用此业务逻辑功能。会发生什么:
如果同时使用相同的参数调用该函数,则两个实例都会检查记录是否存在-并且不存在。因此,两个实例都插入相同的记录。
第一次调用context.SaveChanges()
时,一切正常。但是第二个SaveChanges()
抛出异常,因为记录已经存在(数据库中存在唯一索引)。
如果我捕获到该异常并尝试使用UNIQUE_KEY
的新值插入,由于先前添加的实体仍然在轨道中,因此它仍会引发异常。
如何实现此功能以避免异常?
答案 0 :(得分:0)
您可以修改导致异常的现有实体,而不是简单地在catch块内添加新实体。
foreach (var entry in _dbContext.ChangeTracker.Entries<YourEntity>().Where(e => e.State == EntityState.Added)))
{
entry.Entity.YourProperty = newvalue;
}
只需遍历给定类型的所有实体并更新具有唯一约束的属性即可。