[英]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 屬性時,可以使用一些屬性,例如: virtual
、 ForeignKey
、 InverseProperty
。
不知道你對數據庫的需求是什么,所以我寫了兩個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.