如何使用Entity Framework 7在代碼中首先處理這兩個模型?

asp.net-core c# entity-framework entity-framework-core jointable

問題

我正在編寫將模擬庫的概念ASP.NET 5 MVC6的證明。我正在使用CTP6和beta3。

如何使用代碼優先方法在Entity Framework 7中定義它們的關係?

貨架和書籍需要連接表。在我看來,這個應用程序將一次考慮一個架子和自己的書籍。換句話說,一個書架與書籍有一對多的關係。

楷模

貨架型號:

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

書籍型號:

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

目標

我想實現像這樣在ASP.NET 5.由於TPH和其他功能沒有在EF7還沒有實現,我是在正確的軌道上?

換句話說,我在想以下幾點:

  • ShelfBookViewModel(畢竟我需要一個視圖模型來顯示一個書架和書籍,或者書本能夠回到架子上)。我可能只會將它命名為ShelfBook。這似乎是錯誤的做法。
  • 我希望EF7能夠弄清楚我有一個連接並為單獨的關注點創建視圖模型。否則,這違反了SOLID代碼的做法。下面給出的東西(來自之前的鏈接)。
  • 加入表還沒有在EF7中實現,我問的是徒勞的?

我無法讓以下工作如下所示:

public class Shelf
{
    public int ShelfId { get; set; }

    public string ShelfName { get; set; }

    public ShelfType MyProperty { get; set; }

    public virtual List<Book> Books { get; set; }

    public DateTime Created { get; set; }

    public string CreatedBy { get; set; }

    public DateTime Updated { get; set; }

    public string UpdatedBy { get; set; }

}

感謝您抽出寶貴時間閱讀我的問題。我希望其他人覺得這很有用。

熱門答案

要回答有關多對多的問題,您應該按如下方式定義映射(並且必須更新模型類):

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });

這需要你添加一個ICollection<Shelf> Shelves { get; set; }Book 。但是,如果您這樣做,那麼您將擁有以下內容(這是我的示例的MCVE版本):

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });

然後你不再需要映射,因為EF會按慣例為你生成所有關係,包括只在數據庫本身可見的連接表。

但是 - 從您的實際模型類和圍繞它們的討論 - 看起來您真的只需要一對多,在這種情況下,您應該接受Pynt的答案,並忽略我的。

編輯

正如Gert Arnold在評論中指出的那樣,EF7目前(不再是?)支持生成的連接表,這意味著我們必須自己動手,這無論如何可能更好

這是我認為我可以從現在開始做自己的簡單連接表的方式,如果EF不再為我做這些(警告 - 我只是想在這個問題上關閉循環......我不是打擾在編譯器中嘗試這個,所以YMMV):

modelBuilder.Entity<Shelf>() 
    .HasMany(p => p.Books) 
    .WithMany(t => t.Shelves) // doesn't exist 
    .Map(mc => 
       { 
           mc.ToTable("BookShelves"); 
           mc.MapLeftKey("ShelfId"); 
           mc.MapRightKey("BookId"); 
       });



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因