No Image

On delete no action

СОДЕРЖАНИЕ
0 просмотров
11 марта 2020
Сервисы
Избранные доки
Метки (все метки)
Дополнительно

Содержание

4. Продвинутые возможности внешних ключей

4.3. Операции ON DELETE и ON UPDATE

Выражения ON DELETE и ON UPDATE внешних ключей используются для указания действий, которые будут выполняться при удалении строк родительской таблицы (ON DELETE) или изменении родительского ключа (ON UPDATE). Один и тот же внешний ключ может иметь различные действия, указанные для ON DELETE и ON UPDATE. Действия внешних ключей во многом похожи на триггеры.

В базе данных SQLite действия ON DELETE и ON UPDATE, ассоциированные с внешним ключом, могут быть следующими: NO ACTION, RESTRICT, SET NULL, SET DEFAULT или CASCADE. Если действие не указывается специально, оно по умолчанию является NO ACTION.

  • NO ACTION: опция «NO ACTION» означает, что когда родительский ключ изменяется или удаляется из базы данных, никаких специальных действий не производится.
  • RESTRICT: действие «RESTRICT» заключается в том, что приложению запрещается удалять (для ON DELETE RESTRICT) или изменять (для ON UPDATE RESTRICT) родительский ключ, когда существует один или несколько ссылающихся на него дочерних ключей. Различие между эффектом от действия RESTRICT и обычным поведением внешнего ключа заключается в том, что действие RESTRICT запускается тогда, когда изменяется поле записи, а не тогда, когда завершается текущий запрос, как в случае немедленного ограничения, и не тогда, когда завершается текущая транзакция, как в случае отложенного ограничения. Даже если внешний ключ был заявлен как отложенный, если его действием был объявлен RESTRICT, то SQLite будет выдавать сообщение об ошибке немедленно, как только удаляется или изменяется родительский ключ, от которого зависят дочерние ключи.
  • SET NULL: если действие сконфигурировано как «SET NULL», то при удалении родительского ключа (для ON DELETE SET NULL) или его изменении (для ON UPDATE SET NULL) столбцы дочернего ключа будут устанавливаться в значение NULL во всех строках дочерней таблицы, которые ссылаются на удаляемую/изменяемую строку родительской таблицы.
  • SET DEFAULT: действие «SET DEFAULT» похоже на SET NULL за тем исключением, что значение каждого столбца дочернего ключа устанавливается не в NULL а в значение по умолчанию для данного столбца. О том, как столбцам назначаются значения по умолчанию, можно узнать в подробной документации по CREATE TABLE.
  • CASCADE: действие «CASCADE» распространяет операции удаления и изменения родительского ключа на зависящие от него дочерние ключи. Для действия ON DELETE CASCADE это выражается в том, что каждая строка дочерней таблицы, которая ассоциирована с удаляемой родительской строкой, также будет удалена. Для действия ON UPDATE CASCADE это выражается в том, что значения, сохранённые в зависящем дочернем ключе, будут заменены на новые значения родительского ключа.
Читайте также:  Удаление аккаунта в фейсбук навсегда

Добавим, например, выражение ON UPDATE CASCADE как показано ниже. Это — улучшенная схема из примера в главе 1, позволяющая пользователю изменять столбец «artistid» (родительский ключ внешнего ключа) без нарушения ссылочной целостности:

Задание действий ON UPDATE или ON DELETE не означает, что данное ограничение внешнего ключа не обязано удовлетворяться.

Если, например, задано действие ON DELETE SET DEFAULT, но в родительской таблице отсутствует строка, соответствующая умолчальным значениям столбцов дочернего ключа, то удаление родительского ключа, для которого существуют зависимые дочерние ключи, приведет к нарушению внешнего ключа. Например:

Похоже на те действия SQLite, которые помечены как ON DELETE SET DEFAULT и продемонстрированы в примере выше, работает следующий триггер «AFTER DELETE»:

Всякий раз, когда удаляется строка родительской таблицы с внешним ключом, или когда изменяются значения, сохранённые в столбцах родительского ключа, происходит следующая логическая последовательность событий:

  1. Выполняется программа триггера BEFORE.
  2. Проверяются локальные ограничения (не внешнего ключа).
  3. Обновляется или удаляется строка родительской таблицы.
  4. Выполняются другие действия, требуемые внешним ключом.
  5. Выполняется программа триггера AFTER.

Существует одно существенное различие между действием ON UPDATE внешнего ключа и триггерами SQL. Действие ON UPDATE будет выполняться только если значения родительского ключа изменяются так, что новые значения родительского ключа неэквивалентны старым. Например:

Назад Вперед
4.2. Отложенные внешние ключи 5. Команды CREATE, ALTER и DROP TABLE

Перевод: Дмитрий Скоробогатов, 18.09.2011
Оригинальный текст доступен по адресу http://sqlite.org/foreignkeys.html.

Последнее редактирование: 2011-09-18 01:50:50

This question already has an answer here:

In Entity Framework 7 when I am trying to apply a migration I get the error

Introducing FOREIGN KEY constraint ‘FK_ChangeOrder_User_CreatedByID’ on table ‘ChangeOrder’ may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

I know in older versions of Entity Framework you would deal with this by adding

Читайте также:  Где сдать билеты на поезд ржд

to the DbContext but in EF7 modelBuilder does not seem to have a .Conventions to it and google is only returning older EF 4 though EF 6 results.

How do I specific the ON DELETE NO ACTION constraint in Entity Framework 7?

Edit: The answer provided by Oleg will apparently do it per Foreign Key but I would like to do it globally as it will much easier to use one line of code to declare this globally then have to specify code it out for every single one of the hundreds of relationships I will end up having.

Edit 2: Code for Oleg

marked as duplicate by Community ♦ Jan 15 ’16 at 16:41

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

2 Answers 2

After digging around on GitHub, and working with a very patient guy from MS there, the current solution is to add this to the DbContext

will means creating FK_ChangeOrder_User_CreatedByID with REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE . It should exist in protected override void BuildModel(ModelBuilder modelBuilder) of YourContextModelSnapshot.cs created during migration. I’m not sure that I full understand your question, but I think that you should either add such construct to XXXModelSnapshot.cs or to remove unneeded construct, which already exist here.

UPDATED: I see that you have the problem in the Model. You have the following properties in

Вопрос

В Entity Framework 7, когда я пытаюсь применить миграцию, я получаю ошибку

Представление ограничения FOREIGN KEY «FK_ChangeOrder_User_CreatedByID» в таблице «ChangeOrder» может вызывать циклы или несколько каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.
Не удалось создать ограничение. См. Предыдущие ошибки.

Я знаю, что в более ранних версиях Entity Framework вы бы справились с этим, добавив

Читайте также:  Np трудная задача это

для DbContext, но в EF7 modelBuilder , похоже, не имеет .Conventions и google возвращает только EF 4, хотя результаты EF 6.

Как ON DELETE NO ACTION ограничение ON DELETE NO ACTION в Entity Framework 7?

Редактировать: ответ, предоставленный Олегом, по-видимому, сделает это для внешнего ключа, но я бы хотел сделать это глобально, так как гораздо проще использовать одну строку кода, чтобы объявить это глобально, тогда необходимо указать код для каждого из них сотнях отношений, которые я в конечном итоге получаю.

Редактировать 2: Код для Олега

Принятый ответ

После копания в GitHub и работы с очень терпеливым парнем из MS, текущее решение заключается в том, чтобы добавить это в DbContext

Популярные ответы

будет означать создание FK_ChangeOrder_User_CreatedByID с помощью REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE . Он должен существовать в protected override void BuildModel(ModelBuilder modelBuilder) из YourContextModelSnapshot.cs созданных во время миграции. Я не уверен, что полностью понимаю ваш вопрос, но я думаю, что вы должны либо добавить такую ​​конструкцию в XXXModelSnapshot.cs либо удалить ненужную конструкцию, которая уже существует здесь.

ОБНОВЛЕНО: я вижу, что у вас есть проблема в модели. У вас есть следующие свойства в

Комментировать
0 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock detector