Существует несколько способов включить проверку в ваш проект:
Ограничение сервера SQL
Прочтите эту ветку dba.stackexchange.com/q/5278/571, как создать ограничение.
Плюсы: самый строгий способ гарантировать непротиворечивость ваших данных
Минусы: требуется собственный SQL в скрипте миграции;замедляет DB
Рекомендация: используйте эту опцию, если DB является точкой интеграции;у вас нет контроля над кодом, который пишет в него.
Уровень приложения
Проверка SaveChanges
EF имеет метод ValidateEntity , который вы можете использоватьпереопределите и проверьте, не установлены ли оба FK. EF Core не имеет этого API. Однако вы можете переопределить SaveChanges и использовать ChangeTracker
, чтобы найти сущности и проверить их.
Плюсы: быстрое и простое решение
Минусы: не гарантирует согласованность постоянстваУровень (DB)
Наследование
Решение SaveChanges простое, но оно все же позволяет пользователю делать что-то глупое и получать исключение проверки во время выполнения. Чтобы предотвратить это, вы можете применить свое решение к проверке типов компиляции, введя иерархию классов: A {Id, Name}, B: Base {FK_B}, C: Base {FK_C}. И EF, и EF Core поддерживают таблица на иерархию , поэтому все ваши сущности будут храниться в одной таблице. В своем коде вы сможете добавлять в таблицу только B
(со свойством FK_B
) или C
(с FK_C
).
Плюсы: ограничивает вас, чтобы установить только 1FK на время компиляции
Минусы: более сложное решение, некоторые операции могут быть сложными (например, преобразование объекта из C в B);Запросы менее просты.
Рекомендация: если вы работаете на уровне сохраняемости и предоставляете сущности как есть другим группам, имейте небольшой контроль над тем, что сохраняется.