我試圖實作多對多關系,但我得到:
對于“Artikel.Lager”和“Lager.Artikel”之間的一對一關系,無法確定子/依賴方。要識別關系的子/依賴方,請配置外鍵屬性。如果這些導航不應該是同一關系的一部分,請在不指定反向的情況下配置它們。有關更多詳細資訊,請參閱
代碼:
#region Data [Table("Lager")] public class Lager { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = ""; public string Strasse { get; set; } = ""; public string PLZ { get; set; } = ""; public string Ort { get; set; } = ""; public Artikel Artikel { get; set; } } [Table("LagerArtikel")] public class LagerArtikel { public Guid Id { get; set; } = Guid.NewGuid(); //[ForeignKey("Lager")] //public Guid LagerId { get; set; } //[ForeignKey("Artikel")] //public Guid ArtikelId { get; set; } public int Menge { get; set; } public ICollection<Artikel> Artikels { get; set; } public ICollection<Lager> Lagers { get; set; } } [Table("Artikel")] public class Artikel { public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = ""; public decimal EinkaufspreisNettoEuro { get; set; } public Lager Lager { get; set; } } #endregion #region Context // => EF Core /* Add-Migration Initial -context _1_Testing.XDBContextTesting -o Migrations\XDBContextTestingMig add-migration -Name A3 -Project compDatMVP -context _1_Testing.XDBContextTesting Update-Database -context _1_Testing.XDBContextTesting */ public class XDBContextTesting : DbContext { public DbSet<Lager> Lager { get; set; } public DbSet<LagerArtikel> LagerArtikel { get; set; } public DbSet<Artikel> Artikel { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(new string(Konstanten.ConnectionString.Replace("#db#", "compDat__1__Testing"))); } public XDBContextTesting() : base() { } public XDBContextTesting(DbContextOptions<XDBContextTesting> options) : base(options) { } } #endregion我到底錯過了什么?
uj5u.com熱心網友回復:
你錯過了整個多對多:)
一個 Lager 會有很多Artikels,而一個 Artikel 會有很多 Lager。
public class Lager { [Key] public int LagerId { get; set; } // ... public virtual ICollection<LagerArtikel> LagerArtikels { get; set; } = new List<LagerArtikel>(); } public class Artikel { [Key] public int ArtikelId { get; set; } // ... public virtual ICollection<LagerArtikel> LagerArtikels { get; set; } = new List<LagerArtikel>(); } public class LagerArtikel { [Key] public int LagerArtikelId {get; set;} [ForeignKey("Lager")] public int LagerId {get; set;} [ForeignKey("Artikel")] public int ArtikelId {get; set;} // or just use a composite PK: //[Key, Column(Order=1), ForeignKey("Lager")] //public int LagerId {get; set;} //[Key, Column(Order=2), ForeignKey("Artikel")] //public int ArtikelId {get; set;} public virtual Lager Lager { get; set; } public virtual Artikel Artikel { get; set; } public int Menge { get; set; } }由于鏈接物體 (LagerArtikel) 將具有像 Menge 這樣的附加屬性,因此您需要使用對該物體的參考。如果您只想要一個 LagerArtikel 表,其中只有 LagerId 和 ArtikelId 作為復合 PK 來表示多對多鏈接,使用 EF6 和 EF Core 5 ,您可以取消 LagerArtikel 物體,而 Lager 可以擁有一組 Artikels而 Artikel 有一個 Lagers 的集合,EF 可以在其中管理關系和對應的表,而無需額外的物體。
從表的角度考慮。你會在 LagerArtikel 桌子上放什么?它將有一個 LagerId 和一個 ArtikelId,它不能在一行中存盤許多啤酒和許多Artikel,而是該表中的每一行都將一個 Artikel 鏈接到一個啤酒。許多行將共享一個 ArtikelId,許多行將共享一個 LagerId。
uj5u.com熱心網友回復:
您需要替換
public Artikel Artikel { get; set; }的Lager類也替換public Lager Lager { get; set; }的Artikel類。你寧愿添加
public LagerArtikel LagerArtikel { get; set; }兩個類轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368865.html
標籤:C# sql 实体框架 移民 ef-core-6.0
上一篇:為什么將引數包傳遞給具有一個模板引數的函式多次呼叫它?
下一篇:如何只顯示字典的某些部分?

