Проблема с каскадным удалением с использованием Entity Framework и System.Data.SQLite - PullRequest
15 голосов
/ 19 марта 2010

У меня есть база данных SQLite, которая настроена таким образом, что при удалении человека удаление происходит каскадно. Это прекрасно работает, когда я вручную удаляю Person (все записи, которые ссылаются на PersonID, удаляются). Но когда я использую Entity Framework для удаления человека, я получаю сообщение об ошибке:

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

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

Когда я захожу в редактор моделей и проверяю свойства отношения, он не показывает никаких действий для свойства OnDelete. Почему это не установлено правильно, потянув его из БД? Если я изменю это значение на Cascade, все будет работать правильно, но я бы не стал полагаться на это ручное изменение, потому что, если я обновлю свою модель из БД, и она потеряет это.

Вот оживший SQL для моих таблиц.

CREATE TABLE [SomeTable] 
(
    [SomeTableID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    [PersonID] INTEGER NOT NULL REFERENCES [Person](PersonID) ON DELETE CASCADE
)
CREATE TABLE [Person]
(
    [PersonID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
)

Ответы [ 4 ]

24 голосов
/ 21 марта 2010

Я только что имел дело с этой проблемой. Оказалось, что когда я использовал EF для опции Update model from database..., он не получал правильно правило «Каскад» для удаления.

Попробуйте перейти к модели базы данных EF, щелкните по ассоциации, которая вызывает проблему, затем убедитесь, что End1 OnDelete (может быть End2, зависит от схемы базы данных) установлено на Cascade.

4 голосов
/ 19 октября 2010

У меня была такая же проблема с SQL Server. Когда я пытался обновить режим из базы данных, он не использовал правила каскадирования. Обратите внимание, что правила были добавлены после того, как модель уже была создана. Я даже пытался удалить таблицу из модели и добавить ее обратно. Это имело тот же эффект - никаких каскадных правил.

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

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

1 голос
/ 19 марта 2010

Похоже, ошибка поставщика для меня. Каскад должен быть взят из БД. Попробуйте это с SQL Server; Вы увидите, что это работает там. Вы должны сообщить об этом любому, кто написал ваш поставщик SQLite.

0 голосов
/ 19 августа 2013

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

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