Параметр каскадной миграции EntityFrameworkDelete

Я использую функцию миграции EF 4.3 для создания сценариев миграции базы данных. Когда я запускаю команду Add-Migration, сгенерированный скрипт создается следующим образом:

        CreateTable(
            "dbo.Recipients",
            c => new
                {
                    RecipientID = c.String(nullable: false, maxLength: 128),
                    SurveyRoundID = c.String(nullable: false, maxLength: 128),
                    LastUpdatedAt = c.DateTime(),
                })
            .PrimaryKey(t => t.RecipientID)
            .ForeignKey("dbo.Employees", t => t.EmployeeID, cascadeDelete: true)
            .ForeignKey("dbo.SurveyRounds", t => t.SurveyRoundID, cascadeDelete: true)
            .Index(t => t.EmployeeID)
            .Index(t => t.SurveyRoundID);

Проблема, с которой я столкнулся, заключается в том, что миграция скафолдинга выбирает cascadeDelete как true, даже если объект Recipient не является мастером отношения.

На данный момент я вручную меняю параметр cascadeDelete на false, но я хотел бы знать, почему по умолчанию он выбирает значение true.

Спасибо, Идо.


person Ido Ran    schedule 14.08.2012    source источник


Ответы (2)


Спасибо за ответ, это помогло мне, поскольку я замечал и иногда сталкивался с ошибками при попытке обновить базу данных, поскольку некоторые из моих классов имеют несколько отношений, что делает каскадное удаление не идеальным.

Пожалуйста, смотрите ниже для удаления настройки каскадного удаления по умолчанию:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}

Это входит в класс Context.

person danfer    schedule 20.09.2013
comment
Именно то, что я искал! - person Mixxiphoid; 11.07.2015
comment
Это сработало для меня. Это действительно должно быть согласие, а не отказ! - person Michiel Cornille; 20.08.2015

Он работает так, как ожидалось. Это не основной объект в отношении, и поэтому он определяет ограничение внешнего ключа, и это ограничение имеет опцию каскадного удаления. Установка для каскадного удаления значения true (по умолчанию в коде EF сначала, если вы не удалите соглашение или не измените его в свободном отображении) говорит, что если удаляется запись Employee, каскадное удаление вызовет удаление Recipient (то же самое относится к SurveyRounds).

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

person Ladislav Mrnka    schedule 14.08.2012
comment
Знаете ли вы, как определить ON DELETE SET NULL, не прибегая к DDL с Sql(..) при миграции? - person JoeBrockhaus; 23.07.2015