EF Core - почему ClientSetNull является поведением OnDelete по умолчанию для необязательных отношений (а не SetNull) - PullRequest
0 голосов
/ 23 января 2019

Для необязательных отношений (когда внешний ключ может принимать Null), новое поведение ClientSetNull было введено после EF Core 2.0 в качестве опции по умолчанию для поведения удаления DeleteBehavior.ClientSetNull. Имеет семантику SetNull для отслеживаемых объектов и поведение Restrict (без действий) для записей базы данных, не загруженных в память.

Cascade Delete behaviors

Документы Microsoft говорят, что:

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

Но я думаю, что обычно нормально устанавливать FK зависимых объектов в Null, когда связанный родительский элемент удаляется (каждый где в db). А также, что это за «другие ограничения, которые на практике часто делают этот вариант неосуществимым ...», как заявлено выше?

1 Ответ

0 голосов
/ 12 июня 2019

Другими ограничениями, на которые ссылаются документы, являются, насколько я знаю, кольцевые или многолучевые каскады.

Например, MS Sql Server не разрешает каскады (как удалить, так и установить ноль), если

  • изменение будет каскадно относиться к той же таблице, из которой оно исходит
  • существует несколько каскадных путей к одной и той же таблице.Как таблица «A» влияет на таблицу «B» и «C», так и «B» и «C» влияют на «D».

Вы даже не можете создать ограничение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...