簡體   English   中英

多次使用導航屬性 C# EF Core

[英]Use navigation properties more than once C# EF Core

我有這個數據庫結構

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

}

這就是我創建關系的方式:

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

我收到此錯誤:

無法在“Gameboard.Colors”和“ColorGameBoard.Gameboard”之間創建關系,因為“Gameboard.CorrectColors”和“ColorGameBoard.Gameboard”之間已經存在關系。 導航屬性只能參與單個關系。 如果您想覆蓋現有關系,請首先在“OnModelCreating”中的導航“ColorGameBoard.Gameboard”上調用“Ignore”。

數據庫結構:在 Gameboard 上有兩個列表 colors。 每個列表應至少包含 5 個 colors。 並且數據庫中的每種顏色都可以在多個游戲板上使用。 此外,可以在游戲板上多次使用顏色。

任何人都知道如何解決該錯誤?

您的代碼中存在一些對比關系問題。 Gameboard class 中有兩個ICollection<ColorGameBoard> ,但 ColorGameBoard class 中只包含一個Gameboard 這樣,在構建數據庫的時候就會出錯。 比較關系的數量應該是一致的。 在 EF Core 中構建 InverseProperty 屬性時,可以使用一些屬性,例如: virtualForeignKeyInverseProperty

不知道你對數據庫的需求是什么,所以我寫了兩個demo,下面是我的代碼:

第一個演示,兩個class Gameboard對應一個class Color

游戲板.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; }

    }

顏色.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.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); 

然后,就可以創建數據庫了

在此處輸入圖像描述

第二個演示,一個class Gameboard對應兩個class Color

游戲板.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; }
        
    }

顏色.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.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);

然后,您可以創建數據庫

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM