Подтвердить что ты не робот

Почему ON DELETE SET NULL все еще не реализован в 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 будет обновлять (устанавливать нуль) свои внешние ключи и свойства справки и что другие записи в базе данных затронуты, не наносит вреда поскольку они еще не были загружены.

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

4b9b3361

Ответ 1

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

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

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

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