且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

EF6 Code First - 可能会导致周期或多个级联路径

更新时间:2023-02-03 08:16:11

使用Fluent API:

  //播放器 - 国家队关系
modelBuilder.Entity< Player>()
。HasRequired< Team>(p => p.National)
.WithMany()
.WillCascadeOnDelete(false);

//播放器 - 俱乐部团队关系
modelBuilder.Entity< Player>()
.HasRequired< Team>(p => p.Club)
。 WithMany()
.WillCascadeOnDelete(false);


I'm using EF6 Code First. I have two classes:

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; }

}

And:

 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; }
}

These are my two class with their relationship. A player belongs to two teams: club and national teams. A team can be either club or national, and holds a collection of player.

In my context file I use:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Player>()
                .HasRequired<Team>(p => p.National)
                .WithMany(t => t.Players)
                .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

When running the migration tool to update the database, I get the following error:

Introducing FOREIGN KEY constraint 'FK_dbo.Players_dbo.Teams_TeamNationalId' on table 'Players' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

How do I solve it?

Using 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);