C# 如果我使用WillCascadeOnDelete false,那么如果我想删除团队,那么它就是抛出错误。来自“Team_HomeMatches”关联的关系处于“已删除”状态。给定多重性约束,相应的“团队目标”也必须处于“已删除”状态。请读者注意。尽管这可能

C# 如果我使用WillCascadeOnDelete false,那么如果我想删除团队,那么它就是抛出错误。来自“Team_HomeMatches”关联的关系处于“已删除”状态。给定多重性约束,相应的“团队目标”也必须处于“已删除”状态。请读者注意。尽管这可能,c#,entity-framework,orm,code-first,entity-framework-4.1,C#,Entity Framework,Orm,Code First,Entity Framework 4.1,如果我使用WillCascadeOnDelete false,那么如果我想删除团队,那么它就是抛出错误。来自“Team_HomeMatches”关联的关系处于“已删除”状态。给定多重性约束,相应的“团队目标”也必须处于“已删除”状态。请读者注意。尽管这可能解决了模式定义问题,但它改变了语义。这可能不是没有两个团队就可以进行匹配的情况。我得到了同样的例外。这是我指定外键的标准方法,适用于所有情况,但实体包含多个相同类型的nav属性时除外(类似于HomeTeam和GuestTeam场景),在这种情况


如果我使用WillCascadeOnDelete false,那么如果我想删除团队,那么它就是抛出错误。来自“Team_HomeMatches”关联的关系处于“已删除”状态。给定多重性约束,相应的“团队目标”也必须处于“已删除”状态。请读者注意。尽管这可能解决了模式定义问题,但它改变了语义。这可能不是没有两个团队就可以进行匹配的情况。我得到了同样的例外。这是我指定外键的标准方法,适用于所有情况,但实体包含多个相同类型的nav属性时除外(类似于HomeTeam和GuestTeam场景),在这种情况下,EF在生成SQL时会感到困惑。解决方案是根据接受的答案以及关系双方的两个集合向
OnModelCreate
添加代码。除上述情况外,我在所有情况下都使用onmodelcreating,我使用数据注释外键,也不知道为什么不接受!!那么,在执行之后是什么呢
Restrict
而不是
Cascade
?感谢您的回答,但是它使外键列在匹配表中可以为null。这对我来说在EF 6中非常有用,因为在EF 6中需要可为null的集合。如果您想避免使用流畅的api(无论出于何种原因#differentdiscussion),这非常有效。在我的例子中,我需要在“Match”实体上添加一个额外的foriegnKey注释,因为我的字段/表有PK的字符串。这对我来说非常有用。顺便说一句,如果您不希望列为空,您可以使用[ForeignKey]属性指定外键。如果键不可为null,则所有设置都已设置。为什么需要“Column(Order=0)”呢?这解决了我的问题,因为它是用来排序列的。从原问题中抄袭。它与逆性质无关。
public class Team
{
    [Key]
    public int TeamId { get; set;} 
    public string Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}


public class Match
{
    [Key]
    public int MatchId { get; set; }

    [ForeignKey("HomeTeam"), Column(Order = 0)]
    public int HomeTeamId { get; set; }
    [ForeignKey("GuestTeam"), Column(Order = 1)]
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}
public class Team
{
    public int TeamId { get; set;} 
    public string Name { get; set; }

    public virtual ICollection<Match> HomeMatches { get; set; }
    public virtual ICollection<Match> AwayMatches { get; set; }
}

public class Match
{
    public int MatchId { get; set; }

    public int HomeTeamId { get; set; }
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}


public class Context : DbContext
{
    ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasRequired(m => m.HomeTeam)
                    .WithMany(t => t.HomeMatches)
                    .HasForeignKey(m => m.HomeTeamId)
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<Match>()
                    .HasRequired(m => m.GuestTeam)
                    .WithMany(t => t.AwayMatches)
                    .HasForeignKey(m => m.GuestTeamId)
                    .WillCascadeOnDelete(false);
    }
}
public class Match
{
    [Key]
    public int MatchId { get; set; }

    [ForeignKey("HomeTeam"), Column(Order = 0)]
    public int? HomeTeamId { get; set; }
    [ForeignKey("GuestTeam"), Column(Order = 1)]
    public int? GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}
[ForeignKey("HomeTeamID")]
public virtual Team HomeTeam { get; set; }
[ForeignKey("GuestTeamID")]
public virtual Team GuestTeam { get; set; }
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
public class Team
{
    [Key]
    public int TeamId { get; set;} 
    public string Name { get; set; }

    [InverseProperty("HomeTeam")]
    public virtual ICollection<Match> HomeMatches { get; set; }

    [InverseProperty("GuestTeam")]
    public virtual ICollection<Match> GuestMatches { get; set; }
}


public class Match
{
    [Key]
    public int MatchId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}
public class Team
{
    [Key]
    public int TeamId { get; set;} 
    public string Name { get; set; }

    [InverseProperty(nameof(Match.HomeTeam))]
    public ICollection<Match> HomeMatches{ get; set; }

    [InverseProperty(nameof(Match.GuestTeam))]
    public ICollection<Match> AwayMatches{ get; set; }
}


public class Match
{
    [Key]
    public int MatchId { get; set; }

    [ForeignKey(nameof(HomeTeam)), Column(Order = 0)]
    public int HomeTeamId { get; set; }
    [ForeignKey(nameof(GuestTeam)), Column(Order = 1)]
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public Team HomeTeam { get; set; }
    public Team GuestTeam { get; set; }
}