Entity Framework должен проверять дубликаты записей на основе уникального набора значений для нескольких столбцов, а затем добавлять новую запись - PullRequest
0 голосов
/ 26 октября 2018

У меня есть сценарий, когда несколько вызовов API инициируются разными клиентами через некоторый API (иногда через WebJob), в результате чего код API запускается одновременно. Этот код API вставляет записи в SQL через Entity Framework. Из-за одновременных вызовов таблица позволяет вставлять дубликаты записей, даже если есть условие для проверки существующей записи. Это происходит, когда разница между двумя вызовами составляет лишь долю секунды.

Я хотел бы обработать это на уровне таблицы базы данных, задав для составного ключа [ни один столбец не может быть задан как уникальный] комбинацию из трех столбцов, чтобы SQL никогда не разрешал дублировать записи на основе этих трех столбцов.

Однако один столбец для составного ключа должен разрешать несколько неактивных записей, но не должен разрешать две записи с активными записями.

Ниже приведен пример проработки вопроса:

Записи в красных коробках не должны допускаться, если CategoryId и CategoryTypeid одинаковы и оба активны.

Записи в зеленой рамке должны быть разрешены. Поэтому, если существует несколько записей с одинаковыми CategoryId и CategoryTypeId, только одна из них должна быть активной.

Пожалуйста, помогите в некоторой идее, как разработать решение, чтобы исправить это в конце БД.

Duplicated record example

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Однако один столбец для составного ключа должен разрешать несколько неактивных записей, но не должен разрешать две записи с активными записями.

И в чем здесь проблема?

Определить 2 индекса.

1 уникальный индекс с CatergoryId, CategoryTypeId, IsActive = 1 в качестве фильтра 1, не уникальный индекс CatergoryId, CategoryTypeId, IsActive = 0 в качестве фильтра

Готово.

Фильтры - это малоизвестный факт индексов, которые большинство людей игнорируют.

ТОЛЬКО способ ГАРАНТИРОВАТЬ его.

0 голосов
/ 27 октября 2018

С помощью руководства @TomTom я решил эту проблему с помощью следующих операторов SQL.

Создал два некластеризованных индекса в таблице, попытался повторно вставить дубликаты и получил соответствующую ошибку.Создание этих индексов гарантирует, что в таблице может существовать только одна активная запись.

--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

Надеюсь, это поможет кому-то с подобной проблемой!

0 голосов
/ 26 октября 2018

просто для того, чтобы составить идею, также нельзя комментировать, поэтому поставьте это как ответ. может быть, вы должны пройти через союз все

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

это может вам помочь.

...