У меня есть следующие две сущности:
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).