【问题标题】:EF6 Code First - may cause cycles or multiple cascade pathsEF6 Code First - 可能导致循环或多个级联路径
【发布时间】:2014-02-18 20:49:35
【问题描述】:

我使用的是 EF6 代码优先。 我有两个课程:

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 约束。 无法创建约束。查看以前的错误。

我该如何解决?

【问题讨论】:

标签: entity-framework ef-code-first relationship entity-framework-migrations


【解决方案1】:

使用流畅的 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);

【讨论】:

    【解决方案2】:

    我认为您的Team 只有一个导航属性用于指向它的两个不同的外键,这可能是您的 EF 代码的问题。在您的Team 上有两个导航属性可能更容易接受 - 每个指向它的外键一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-26
      • 2016-03-26
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 2022-01-05
      • 2020-06-14
      相关资源
      最近更新 更多