У меня есть БД SQLite, которая настроена так, что когда я удаляю Человека, удаление происходит каскадно. Это прекрасно работает, когда я вручную удаляю 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, все будет работать правильно, но я бы не стал полагаться на это ручное изменение, потому что, если я обновлю свою модель из БД, и она потеряет это.
Вот живой 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
)
Я только что имел дело с этой проблемой. Оказалось, что когда я использовал EF для Update model from database...
, он не правильно получал правило "Каскад" для удаления.
Попробуйте перейти к своей модели базы данных EF, щелкните по ассоциации, которая вызывает проблему, затем убедитесь, что End1 OnDelete
(может быть End2, зависит от схемы базы данных) установлен в Cascade
.
У меня была такая же проблема с SQL Server. Когда я пытался обновить режим из базы данных, он не использовал правила каскадирования. Обратите внимание, что правила были добавлены после того, как модель уже была создана. Я даже пытался удалить таблицу из модели и добавить ее обратно. Это имело тот же эффект - никаких каскадных правил.
Однако, когда я создал совершенно новую модель с такими же точными таблицами, она применила правила каскадирования. Поэтому я решил удалить старую модель и создать новую с тем же именем и т. Д.
Я предполагаю, что что-то не так с моделью обновления из базы данных.