我正在使用EF6 Code First。 我有两个班:
public class Player
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }
[Required, MinLength(2, ErrorMessage = "Player name must be at least 2 characters length")]
public string Name { get; set; }
[Required]
public int TeamClubId { get; set; }
[Required]
public int TeamNationalId { get; set; }
[Required, ForeignKey("TeamClubId")]
public virtual Team Club { get; set; }
[Required, ForeignKey("TeamNationalId")]
public virtual Team National { get; set; }
}
并且:
public class Team
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required, MinLength(2, ErrorMessage = "Team name must be at least 2 characters length")]
public string Name { get; set; }
[Required]
public TeamType Type { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
这是我与他们关系的两个班级。 一名球员属于两支球队:俱乐部和国家队。 一个团队可以是俱乐部或国家队,并拥有一个球员集合。
在我的上下文文件中,我使用:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>()
.HasRequired<Team>(p => p.National)
.WithMany(t => t.Players)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
运行迁移工具更新数据库时,出现以下错误:
在'Players'表上引入FOREIGN KEY约束'FK_dbo.Players_dbo.Teams_TeamNationalId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。
我该如何解决?
答案 0 :(得分:9)
使用Fluent API:
//player - national team relations
modelBuilder.Entity<Player>()
.HasRequired<Team>(p => p.National)
.WithMany()
.WillCascadeOnDelete(false);
//player - club team relations
modelBuilder.Entity<Player>()
.HasRequired<Team>(p => p.Club)
.WithMany()
.WillCascadeOnDelete(false);
答案 1 :(得分:0)
我认为你的Team
只有一个指向它的两个不同外键的导航属性,这可能是你的EF代码有问题。在Team
上有两个导航属性可能更容易接受 - 每个导航属性对应一个导航属性。