Entity framework EF级联从两个单独的表中删除
我有以下两个实体:Entity framework EF级联从两个单独的表中删除,entity-framework,cascade,relationships,Entity Framework,Cascade,Relationships,我有以下两个实体: 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 Timeslo
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; }
}
这个实体也会有一个指向匹配实体的导航属性,但为了简洁起见,我省略了这个属性
删除字段或时间段时,我希望它也删除相关的FieldPlanning记录
如果我运行应用程序,我会得到一个错误,即“时隙规划可能导致周期或多个级联路径”。如果我随后编辑模型,创建方式如下:
modelBuilder.Entity<Timeslot>()
.HasMany(ts => ts.FieldPlannings)
.WithRequired(fp => fp.Timeslot)
.HasForeignKey(fp => fp.TimeslotID)
.WillCascadeOnDelete(false);
modelBuilder.Entity()
.HasMany(ts=>ts.FieldPlanning)
.WithRequired(fp=>fp.Timeslot)
.HasForeignKey(fp=>fp.TimeslotID)
.WillCascadeOnDelete(假);
如果我随后删除了一个字段,那么FieldPlanning将毫无问题地与它一起删除。如果我试图删除一个时间段,我会得到与以前相同的错误
如何修复它,以便可以删除字段或时隙中的任何一个,并且对于这两个实体,CascadeOnDelete都可以为true
我读了Hans Riesebos的答案,但我不知道如何将其应用于我的问题
编辑:
我的位置实体:
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 int LocationID{get;set;}
公共字符串名称{get;set;}
公共广播地址{get;set;}
公共int TournamentID{get;set;}
公开虚拟锦标赛{get;set;}
公共虚拟ICollection字段{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; }
}
公共类匹配{
公共int MatchID{get;set;}
公共布尔没收{get;set;}
public int TeamAID{get;set;}
public int TeamBID{get;set;}
public int FieldPlanningID{get;set;}
公共虚拟团队团队{get;set;}
公共虚拟团队b{get;set;}
公共虚拟FieldPlanning FieldPlanning{get;set;}
公共虚拟ICollection{get;set;}
}
在尝试时,我特别注释了要匹配的导航属性,因此我可以确保它首先在没有匹配的情况下工作,因为我知道FieldPlanning和Match之间的关系存在问题,因为这是一个0..1到0..1的关系。但在我当前的问题中,我看不出这有什么关系(只要我在FieldPlanning中保留Match的导航属性就行了)。再搜索一点后,我找到了一个线程,它正确地指出SQL Server不允许这样做。我原以为问题出在实体框架上,但在尝试在SSMS中重新创建表之后,我注意到它仍然不起作用
解决方案是禁用其中一个级联效果,并使用触发器(或代码)首先删除子行。问题很可能与您的位置和匹配实体有关。同时显示这些实体和映射。@LadislavMrnka我现在也添加了这些实体。
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; }
}