EF Cascade удалить из двух отдельных таблиц - PullRequest
0 голосов
/ 29 марта 2012

У меня есть следующие две сущности:

public class Field {
    public int FieldID { get; set; }
    public String Name { get; set; }
    public int LocationID { get; set; }

    public virtual ICollection<FieldPlanning> FieldPlannings { get; set; }
}

public class Timeslot {
    public int TimeslotID { get; set; }
    public DateTime Start { get; set; }
    public int MatchDayID { get; set; }

    public virtual ICollection<FieldPlanning> FieldPlannings { get; set; }
}

Теперь комбинация этих двух сущностей составляет следующую сущность:

public class FieldPlanning {
    public int FieldPlanningID { get; set; }
    public int TimeslotID { get; set; }
    public int FieldID { get; set; }


    public virtual Timeslot Timeslot { get; set; }
    public virtual Field Field { get; set; }
    public virtual Match Match { get; set; }
}

У этого объекта также будет свойство навигации к объекту Match, но для краткости я это исключил.

Когда удаляется либо поле, либо таймслот, я хочу, чтобы он также удалял связанные записи FieldPlanning.

Если я запускаю приложение, я получаю сообщение об ошибке «Timeslot_FieldPlanning может вызвать циклы или несколько каскадных путей». Если я потом отредактирую модель, создавая так:

        modelBuilder.Entity<Timeslot>()
            .HasMany(ts => ts.FieldPlannings)
            .WithRequired(fp => fp.Timeslot)
            .HasForeignKey(fp => fp.TimeslotID)
            .WillCascadeOnDelete(false);

Если я затем удаляю поле, FieldPlanning удаляется вместе с ним без проблем. Если я пытаюсь удалить таймслот, я получаю ту же ошибку, что и раньше.

Как это исправить, чтобы я мог удалить либо поле, либо таймслот, и для обоих объектов CascadeOnDelete может иметь значение true?

Я прочитал ответ Ханса Рисебоса здесь , но я не мог понять, как применить его к моей проблеме.

EDIT: My Location Entity:

public class Location {
    public int LocationID { get; set; }
    public String Name { get; set; }
    public Address Address { get; set; }
    public int TournamentID { get; set; }

    public virtual Tournament Tournament { get; set; }

    public virtual ICollection<Field> Fields { get; set; }
}

My Match Entity:

public class Match {
    public int MatchID { get; set; }
    public Boolean Forfeited { get; set; }
    public int TeamAID { get; set; }
    public int TeamBID { get; set; }
    public int FieldPlanningID { get; set; }


    public virtual Team TeamA { get; set; }
    public virtual Team TeamB { get; set; }
    public virtual FieldPlanning FieldPlanning { get; set; }

    public virtual ICollection<Official> Officials { get; set; }
}

Испытывая его, я специально прокомментировал свойство навигации как Match, так что я мог убедиться, что оно сначала работает без Match, потому что я знаю, что у меня есть проблема в отношениях между FieldPlanning и Match, так как это 0..1 к 0..1 отношения. Но я не вижу, как это имеет значение в моей текущей проблеме (пока я прокомментирую свойство навигации Match в FieldPlanning).

1 Ответ

0 голосов
/ 30 марта 2012

После поиска немного больше я нашел этот поток , который правильно утверждает, что SQL Server не позволяет этого. Я думал, что проблема была в Entity Framework, но после попытки воссоздать таблицы в SSMS я заметил, что он все еще не работает.

Решение состоит в том, чтобы отключить один из каскадных эффектов и использовать триггер (или код), чтобы сначала удалить дочерние строки.

...