2013-12-14 124 views
0

我有这个类称为匹配,它表示两个团队之间的匹配,但是当我运行代码时,我得到一个异常。外键导致异常

代码:

[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 { ... } 
    } 

}

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

有没有什么办法解决这个问题,或者我的代码可以用来解决这个问题?

回答

0

问题是EF默认使用ON DELETE CASCADE创建FK约束。那就是当一个团队被删除时,所有的匹配都会被自动删除。但是,由于比赛指向多个球队,因此会创建一个循环删除循环,删除比赛需要删除其他球队,这需要删除其中的比赛等等。

要解决此问题,请使用流畅配置设置关联,以便手动关闭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); 

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