2014-01-05 1 views
32

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

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

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"); 
} 

(Пример взять из this post.)

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

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

+0

id нравится видеть эту функцию тоже, но ее больше вопрос для http://entityframework.codeplex.com/discussions –

+0

@philsoady Я не могу найти тему там. Кажется, легко добавить это: он не сильно отличается от каскадного удаления, не так ли? – Dabblernl

+0

Этот вопрос не соответствует теме, поскольку он относится к сайту запроса функций продукта (https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/) –

ответ

2

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

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

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

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

+1

* Функция, вероятно, не реализована, потому что обычно изменения влияют только на объекты, которые фактически находятся в единице работы. * То же самое верно для каскадных удалений, которые по умолчанию настраиваются EF. Мягкие удаления - это другая тема для обсуждения ;-) – Dabblernl

+0

Затем они также должны удалить каскадные удаления. По крайней мере, они последовательны. –