EF Cascade从两个单独的表中删除

时间:2012-03-29 04:03:40

标签: 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 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的导航属性进行评论)。

1 个答案:

答案 0 :(得分:0)

在搜索了一点之后,我发现this线程正确地指出SQL Server不允许这样做。我认为问题出在Entity Framework上,但在尝试在SSMS中重新创建表后,我注意到它仍然无效。

解决方案是禁用其中一个级联效果,并使用触发器(或代码)首先删除子行。