EntityFramework Migration cascadeDelete параметър

Използвам функцията за мигриране на 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>();
}

Това влиза в контекстния клас.

person danfer    schedule 20.09.2013
comment
Точно това, което търсих! - person Mixxiphoid; 11.07.2015
comment
Това работи добре за мен. Това наистина трябва да бъде включване вместо отказ! - person Michiel Cornille; 20.08.2015

Работи според очакванията. Той не е основен обект в релацията и поради това дефинира ограничение за външен ключ и това ограничение има опция за каскадно изтриване. Задаването на каскадно изтриване на вярно (първо по подразбиране в EF кода, освен ако не премахнете конвенцията или не я промените при плавно картографиране) казва, че ако Employee записът бъде изтрит, каскадното изтриване ще задейства изтриването на Recipient (същото важи и за SurveyRounds).

Този модел наистина не е идеален за каскадно изтриване, тъй като обектът е зависим в множество отношения. Трябва да премахнете каскадното изтриване директно в съпоставянето на обекта.

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