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; }
}