外键导致异常

时间:2013-12-14 17:32:30

标签: c# asp.net-mvc-4

我有一个名为Match的类,它表示两个团队之间的匹配,但是当我运行代码时,我得到了一个例外。

代码:

[Table("Matches")]
public class Match {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int MatchId { get; set; }
    public int TeamAId { get; set; }
    public int TeamBId { get; set; }

    public int TeamAScore { get; private set; }
    public int TeamBScore { get; private set; }

    [ForeignKey("TeamAId")]
    public virtual Team TeamA { get; set; }

    [ForeignKey("TeamBId")]
    public virtual Team TeamB { get; set; }

    public Boolean Draw {
        get { ... }
    }

    public Team Loser {
        get { ... }
    }

    public Team Winner {
        get { ... }
    }

}

例外: 在表'匹配'上引入FOREIGN KEY约束'FK_dbo.Matches_dbo.Teams_TeamBId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。

有没有办法解决这个问题,或者我的代码有什么变化可以申请解决这个问题?

1 个答案:

答案 0 :(得分:0)

问题是EF默认使用ON DELETE CASCADE创建FK约束。也就是说,当一个团队被删除时,所有的匹配都会被自动删除。但是,因为匹配指向多个团队,所以会创建循环删除循环,删除匹配将需要删除其他团队,这需要删除它的匹配,依此类推。

要解决此问题,请使用fluent配置设置关联,以便手动关闭ON DELETE CASCADE。例如:

class MatchConfiguration : EntityTypeConfiguration<Match> {
    public MatchConfiguration() {
        this.HasRequired(m => m.TeamB)
            .WithMany(t => t.Matches) // if you don't have the property Team.Matches, you can pass no arguments here
            .HasForeignKey(t => t.TeamBId)
            .WillCascadeOnDelete(false);
    }
}

// in OnModelCreating in your db context:
builder.Configurations.Add(new MatchConfiguration);

也可能有一种方法只使用属性配置来指定它,但我不知道它。