Entity framework core 唯一密钥冲突后无法重新插入

Entity framework core 唯一密钥冲突后无法重新插入,entity-framework-core,ef-core-2.1,Entity Framework Core,Ef Core 2.1,我有以下情况: 使用EF Core2的业务逻辑函数检查记录是否已经存在。如果记录不存在,则将其插入数据库中 我有多个线程调用这个业务逻辑函数。发生的情况是: 如果使用相同的参数同时调用该函数,则两个实例都会检查该记录是否存在。因此,两个实例都插入相同的记录 在第一个实例上调用context.SaveChanges()时,一切正常。但是第二个SaveChanges()抛出异常,因为记录已经存在(数据库上有一个唯一的索引) 如果我捕获该异常并尝试为UNIQUE\u KEY插入新值,它仍然会抛出异常,

我有以下情况:

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

我有多个线程调用这个业务逻辑函数。发生的情况是:

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

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

如果我捕获该异常并尝试为
UNIQUE\u KEY
插入新值,它仍然会抛出异常,因为以前添加的实体仍在跟踪中


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

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

foreach (var entry in _dbContext.ChangeTracker.Entries<YourEntity>().Where(e => e.State == EntityState.Added)))
{
    entry.Entity.YourProperty = newvalue;
}
foreach(在_dbContext.ChangeTracker.Entries()中的var条目,其中(e=>e.State==EntityState.Added)))
{
entry.Entity.YourProperty=newvalue;
}

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

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

foreach (var entry in _dbContext.ChangeTracker.Entries<YourEntity>().Where(e => e.State == EntityState.Added)))
{
    entry.Entity.YourProperty = newvalue;
}
foreach(在_dbContext.ChangeTracker.Entries()中的var条目,其中(e=>e.State==EntityState.Added)))
{
entry.Entity.YourProperty=newvalue;
}
只需迭代给定类型的所有实体,并更新具有唯一约束的属性