我有一个名为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约束。 无法创建约束。查看以前的错误。
有没有办法解决这个问题,或者我的代码有什么变化可以申请解决这个问题?
答案 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);
也可能有一种方法只使用属性配置来指定它,但我不知道它。