Проблема с удалением каскада с использованием Entity Framework и System.Data.SQLite

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

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, все будет работать правильно, но я бы предпочел не полагаться на это изменение вручную, потому что, если я обновляю свою модель из БД, и она теряет это.

Здесь находится relivent 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
)

Ответы

Ответ 1

Я только что рассмотрел этот точный вопрос. Оказалось, что когда я использовал параметр EF для Update model from database..., он не получил правильное правило "Cascade" для удаления.

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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