Použijte navigační vlastnosti, více než jednou C# EF Core

0

Otázka

Mám tuto strukturu Databáze

public class Gameboard
{
    public string Id { get; set; }
    public int Round { get; set; }
    public int MaxTries { get; set; }
    public ICollection<ColorGameBoard> Colors { get; set; }
    public ICollection<ColorGameBoard> CorrectColors { get; set; }

}
public class Color
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<ColorGameBoard> ColorGameBoards { get; set; }

}
public class ColorGameBoard
{
    public int Id { get; set; }
    public int GameBoardId { get; set;}
    public Gameboard Gameboard { get; set; }
    public int CorrectColorId { get; set; }
    public Color CorrectColors { get; set; }
    public int ColorId { get; set; }
    public Color Color { get; set; }

}

To je, jak jsem se vytvořit vztahů:

  modelBuilder.Entity<ColorGameBoard>()
            .HasOne(x => x.Gameboard)
            .WithMany(x => x.CorrectColors)
            .HasForeignKey(x => x.CorrectColorId);

        modelBuilder.Entity<ColorGameBoard>()
          .HasOne(x => x.Gameboard)
          .WithMany(x => x.Colors)
          .HasForeignKey(x => x.ColorId);

        modelBuilder.Entity<ColorGameBoard>()
           .HasOne(x => x.Color)
           .WithMany(x => x.ColorGameBoards)
           .HasForeignKey(x => x.GameBoardId);

Dostanu tuto chybu:

Nelze vytvořit vztah mezi 'Gameboard.Barvy " a " ColorGameBoard.Gameboard, protože vztah již existuje mezi Gameboard.CorrectColors " a " ColorGameBoard.Gameboard'. Navigační vlastnosti se mohou účastnit pouze v jediném vztahu. Pokud chcete přepsat existující vztah zavolat "Ignorovat" na navigaci ColorGameBoard.Gameboard první v OnModelCreating'.

Struktura databáze: Na hrací plán má dvě seznam s barvami. Každý seznam by měl obsahovat alespoň 5 barev. A každá barva v databázi mohou být použity na několika gameboard. Navíc, barva může být použit jako mnohokrát chtěla na gameboard.

Nevíte někdo, jak opravit tuto chybu?

asp.net asp.net-core c# ef-core-2.0
2021-11-22 19:52:21
1

Nejlepší odpověď

3

Tam jsou některé naopak vztahové problémy v kódu. Tam jsou dvě ICollection<ColorGameBoard> v Gameboard třídy, ale jen jeden Gameboard je zahrnuta v ColorGameBoard třídy. Tímto způsobem dojde k chybě při vytváření databáze. Počet porovnání vztahů by měly být v souladu. Když budete stavět InverseProperty Atribut v EF Jádro , můžete použít některé atributy, jako je :virtual,ForeignKey,InverseProperty.

Nevím, jaké jsou vaše potřeby pro databáze,TAKŽE píšu dvě dema,Tady je můj kód:

První demo,Dvě class Gameboard odpovídá jeden class Color.

Gameboard.class

public class Gameboard
    {
        public int Id { get; set; }
        public int Round { get; set; }
        public int MaxTries { get; set; }

        [InverseProperty("GameboardOne")]
        public ICollection<ColorGameBoard> OneBorad { get; set; }

        [InverseProperty("GameboardTwo")]
        public ICollection<ColorGameBoard> TwoBoard { get; set; }

    }

Color.class

public class Color
    {
        public int Id { get; set; }
        public string Name { get; set; }
        [InverseProperty("Color")]
        public ICollection<ColorGameBoard> ColorGameBoards { get; set; }
    }

ColorGameBoard.class

public class ColorGameBoard
    {
        public int Id { get; set; }

        [ForeignKey("GameboardOne")]
        public int OneId { get; set; }
        public virtual Gameboard GameboardOne { get; set; }

        [ForeignKey("GameboardTwo")]
        public int TwoId { get; set; }
        public virtual Gameboard GameboardTwo { get; set; }

        [ForeignKey("Color")]
        public int ColorId { get; set; }
        public virtual Color Color { get; set; }
    }

modelBuilder

            modelBuilder.Entity<ColorGameBoard>()
                .HasOne(c => c.Color)
                .WithMany(a =>a.ColorGameBoards)
                .HasForeignKey(b => b.ColorId)
                .OnDelete(DeleteBehavior.NoAction);

            modelBuilder.Entity<ColorGameBoard>()
                .HasOne(d => d.GameboardOne)
                .WithMany(e => e.OneBorad)
                .HasForeignKey(b => b.OneId)
                .OnDelete(DeleteBehavior.NoAction); 

            modelBuilder.Entity<ColorGameBoard>()
                .HasOne(d => d.GameboardTwo)
                .WithMany(e => e.TwoBoard)
                .HasForeignKey(b => b.TwoId)
                .OnDelete(DeleteBehavior.NoAction); 

Pak,můžete vytvořit databáze

enter image description here

Druhé demo,Jeden class Gameboard odpovídá dvěma class Color.

Gameboard.class

public class Gameboard
    {
        public int Id { get; set; }
        public int Round { get; set; }
        public int MaxTries { get; set; }
        [InverseProperty("Gameboard")]
        public ICollection<ColorGameBoard> Colors { get; set; }
        
    }

Color.class

public class Color
    {
        public int Id { get; set; }
        public string Name { get; set; }
        [InverseProperty("Color")]
        public ICollection<ColorGameBoard> ColorGameBoards { get; set; }
        [InverseProperty("CorrectColors")]
        public ICollection<ColorGameBoard> CorrectColors { get; set; }
    }

ColorGameBoard.class

public class ColorGameBoard
    {
        public int Id { get; set; }

        [ForeignKey("Gameboard")]
        public int GameBoardId { get; set; }
        public virtual Gameboard Gameboard { get; set; }

        [ForeignKey("CorrectColors")]
        public int CorrectColorId { get; set; }
        public virtual Color CorrectColors { get; set; }

        [ForeignKey("Color")]
        public int ColorId { get; set; }
        public virtual Color Color { get; set; }
    }

modelBuilder

            modelBuilder.Entity<ColorGameBoard>()
                .HasOne(x => x.Gameboard)
                .WithMany(x => x.Colors)
                .HasForeignKey(x => x.GameBoardId)
                .OnDelete(DeleteBehavior.NoAction);

            modelBuilder.Entity<ColorGameBoard>()
              .HasOne(x => x.CorrectColors)
              .WithMany(x => x.CorrectColors)
              .HasForeignKey(x => x.CorrectColorId)
              .OnDelete(DeleteBehavior.NoAction);

            modelBuilder.Entity<ColorGameBoard>()
               .HasOne(x => x.Color)
               .WithMany(x => x.ColorGameBoards)
               .HasForeignKey(x => x.ColorId)
               .OnDelete(DeleteBehavior.NoAction);

Pak, můžete vytvořit databázi

enter image description here

2021-11-23 07:59:13

Co mám dělat, když chci přidat seznam barev na hrací plán? Mám tento kód: var gameboard = nový Gameboard() { Id = GenerateRandomId(), Barvy = db.GameboardColors.Kde(x => x.GameBoardId == id).ToList(), MaxTries = numberOfGuesses, Kolo = 1, };
Raj

@raj pochybuji o správnosti svých návrhů. Jak jsem uvedl výše, myslím, že stačí dvě křižovatky třídy, takže můžete zvládnout seznamy barvy nezávisle na sobě.
Gert Arnold

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................