Entity Framework 应根据少数列的唯一值集检查重复记录,然后添加新记录

Entity Framework should check duplicate records based on unique set of values for few columns and then add the new record

我有一个场景,其中多个 API 调用是通过一些 API(有时通过 WebJob)从不同的客户端触发的,导致 API 代码以并发方式触发. 此 API 代码在 SQL 到 Entity Framework 中插入记录。由于并发调用,即使存在检查现有记录的条件,table 也允许插入重复记录。当两次调用之间只有几分之一秒的差异时,就会发生这种情况。

我想在数据库 table 级别处理这个问题,方法是将复合键 [不能将单个列设置为唯一] 设置为三列的组合,这样 SQL 永远不会允许基于这三列的重复条目。

但是,复合键的列之一应允许多个非活动记录,但不应允许两个条目具有活动记录。

下面的例子将详细说明这个问题:

CategoryId 和CategoryTypeid 相同且都处于活动状态时,不应允许出现红框记录。

绿框记录应该是允许的。因此,如果有多个记录具有相同的 CategoryId 和 CategoryTypeId,则只有其中一个应该处于活动状态。

请帮忙想出如何设计一个解决方案来在数据库端解决这个问题。

只是想出个主意也不能评论所以把这个作为答案。 也许你应该通过工会

 select distinct categoryID,categoryTypeID,IsActive from Table where IsActive=1
 union all
 select categoryID,CategoryTypeID,IsActive from Table where IsActive=0

这可能对你有帮助。

However, one of the column for composite key should allow multiple inactive records, but should not allow two entries with active records.

这里有什么问题?

定义 2 个索引。

1 个唯一索引,CategoryId、CategoryTypeId、IsActive = 1 作为过滤器 1 非唯一索引 CategoryId、CategoryTypeId、IsActive = 0 作为过滤器

完成。

过滤器是大多数人忽视的鲜为人知的索引事实。

保证它的唯一方法。

在@TomTom 的指导下,我已经通过以下 SQL 语句解决了这个问题。

在 table 上创建了两个非聚集索引并尝试重新插入重复项并得到相应的错误。创建这些索引可确保 table.

中只能存在一个活动记录
--add unique nonclustered filtered index that allows only one active record
CREATE UNIQUE NONCLUSTERED INDEX unique_active_projects
ON TestDuplicates(CategoryId,CategoryTypeId,IsActive)
WHERE IsActive = 1
GO

--add non-unique nonclustered filtered index to allow multiple non-active records
CREATE NONCLUSTERED INDEX nonunique_inactive_projects
ON TestDuplicates(CategoryId,CategoryTypeId,IsActive)
WHERE IsActive = 0
GO

希望这对遇到类似问题的人有所帮助!