我有一个使用实体框架的基本web api应用程序。我每小时从api收到数百个事件,其中一些事件导致错误:
System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常---> System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常---> System.Data.SqlClient.SqlException:违反PRIMARY KEY约束' PK_dbo.ApiTable'。无法在对象' dbo.ApiTable'中插入重复键。重复键值为(123456)。 声明已经终止。
我有一个处理器来处理对使用AddOrUpdate
以避免重复PK的通用存储库的调用。
处理器:
using (var unitOfWork = new UnitOfWork())
{
unitOfWork.ApiTableRepository.AddOrUpdate(apiTable);
await unitOfWork.SaveAsync();
}
存储库:
public virtual void AddOrUpdate(TEntity entityToUpdate)
{
dbSet.AddOrUpdate(entityToUpdate);
}
我还会在每次收到事件时记录,以及该事件的PK,看起来它可能与同一时间段内同一PK的多个事件有关,尽管AddOrUpdate
应该仍然照顾我的想法。以下是失败事件的日志:
09:36:31.979 2017-09-29 [22] INFO - 收到的活动,PK:123456
09:36:31.994 2017-09-29 [9] INFO - 收到的活动,PK:123456
09:36:32.026 2017-09-29 [9] ERROR - 尝试处理PK时出错:123456