0

I would like to have multiple one-to-many relationships between two classes, unfortunately, when doing update database, I'm getting SqlException.

Introducing FOREIGN KEY constraint 'FK_Game_Player_PlayerTwoId' on table 'Game' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.)

Player class:

    [Table("Player")]
    public class Player
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [ConcurrencyCheck]
        public string Name { get; set; }
        public ICollection<Game>? CreatedGames { get; set; } = new Collection<Game>();
        public ICollection<Game>? ParticipatedGames { get; set; } = new Collection<Game>();
    }

Game class:

    public class Game
    {
        [Key]
        public int Id { get; init; } 
        public int PlayerOneId { get; init; }
        [Required]
        public Player PlayerOne { get; init; } 
        public int PlayerTwoId { get; init; }
        [Required]
        public Player PlayerTwo { get; init; }
        [Required]
        public ICollection<Round> Rounds { get; set; } = new HashSet<Round>();
    }

OnModelcreating:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder));

            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Player>().HasMany(c => c.CreatedGames).WithOne(g => g.PlayerOne).HasForeignKey(c => c.PlayerOneId);
            modelBuilder.Entity<Player>().HasMany(c => c.ParticipatedGames).WithOne(g => g.PlayerTwo).HasForeignKey(c => c.PlayerTwoId);

  
        }
  • Specify something like `.OnDelete(DeleteBehavior.ClientCascade);` after your WithOne. The answers you seek are all here: https://learn.microsoft.com/en-us/ef/core/saving/cascade-delete – Caius Jard Feb 04 '22 at 20:38
  • When deleting a player (or a game) I don't want to delete the other entity, so I Would use `DeleteBehavior.SetNull` . However, I'm getting the same error. – Mihály Varga Feb 04 '22 at 20:51
  • SetNull will realize a database side operation of ON DELETE SET NULL. To stop the cycles in the graph that sale complained about you need one of the sides of the cycle to be ON DELETE NO ACTION – Caius Jard Feb 04 '22 at 23:05

0 Answers0