我有以下两个实体:
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将被删除而没有问题。如果我尝试删除时间段,我会得到与以前相同的错误。
如何修复它以便我可以删除Field或Timeslot,对于两个实体,CascadeOnDelete都可以为真?
我读过Hans Riesebos的回答here,但我无法弄清楚如何将它应用到我的问题中。
编辑: 我的位置实体:
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; }
}
我的匹配实体:
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,所以我可以确保它首先没有匹配,因为我知道FieldPlanning和Match之间的关系有问题,因为这是0..1到0..1关系。但我不知道这在我当前的问题中是如何重要的(只要我在FieldPlanning中保持Match的导航属性进行评论)。
答案 0 :(得分:0)
在搜索了一点之后,我发现this线程正确地指出SQL Server不允许这样做。我认为问题出在Entity Framework上,但在尝试在SSMS中重新创建表后,我注意到它仍然无效。
解决方案是禁用其中一个级联效果,并使用触发器(或代码)首先删除子行。