Почему ON DELETE SET NULL все еще не реализован в Entity Framework 6? Есть ли загвоздка?

ef-code-first entity-framework entity-framework-6

Вопрос

По-прежнему невозможно настроить связь с правилом ON DELETE SET NULL с использованием кода Entity Framework. В качестве обходного пути вы должны загрузить все связанные объекты в памяти, а затем при удалении родительского объекта EF выдаст команды SQL, чтобы установить их внешние ключи в Null.

Это, хотя тривиально реализовать это самостоятельно, используя что-то вроде:

protected override void Seed(Context context)
{
    context.Database.ExecuteSqlCommand("ALTER TABLE dbo.Guests DROP CONSTRAINT Guest_PreferredLanguage");
    context.Database.ExecuteSqlCommand("ALTER TABLE dbo.Guests ADD CONSTRAINT Guest_PreferredLanguage FOREIGN KEY (LanguageID) REFERENCES dbo.Languages(LanguageID) ON UPDATE NO ACTION ON DELETE SET NULL");
}

(Пример из этого сообщения .)

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

Итак, почему эта функция все еще отсутствует? Есть ли скрытая загвоздка?

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

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

И я также думаю, что в большинстве случаев мягкие удаления лучше. Может, это что-то для вас?

Возможно, вы также захотите ознакомиться с проектом Domain Driven. Это также касается правильного использования единиц работы (с агрегатами).

Btw ваше решение редактирует базу данных в методе seed. Возможно, было бы лучше сделать это методом Up () миграции.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему