如何首先使用EF核心代碼創建連接表

asp.net-mvc entity-framework-core

我有這三個模型:

public class Card
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Class { get; set; }
    public string Image { get; set; }
}

public class Deck
{
    public int ID {get; set;}
    public string Name {get; set;}
    public string Class {get; set;}
    public virtual ICollection<DeckCard> DeckCards {get; set;}
}

public class DeckCard
{
    public int ID {get; set;}
    public int DeckID {get; set;}
    public int CardID {get; set;}
}

我想基本上使用DeckCard模型作為連接表。我需要能夠在DecksController / Index視圖中填充它。任何人都可以給我指導或指出我正確的方向嗎?

請注意,Card表是一個靜態表(我不知道它是否是正確的術語,但它將填充並保持遊戲當前具有的任何卡(它是甲板構建網站))。

一般承認的答案

第一。您不需要為一對多關係創建模型(DeckCard),以便EF在您的數據庫中自動創建此表。

第二。在DbContext類中添加或覆蓋OnModelCreating方法例如:

MyApplicationDbContext.cs

 public class MyApplicationDbContext : DbContext
 {
     public DbSet<Card> Cards { get; set; }

     public DbSet<Deck> Decks { get; set; }

   // This is Model Builder
     protected override void OnModelCreating(DbModelBuilder builder)
     { 
           modelBuilder.Entity<Card>()
                .HasRequired<Card>(_ => _.Card)
                .WithMany(_ => _.Deck);

     }

 }

DecksController.cs

 public ActionResult Index()
 { 
      var model = context.Card.AsNoTracking().Include(_ => _.Decks).ToList(); 

      return View(model);
 }

對於使用Eager加載的連接查詢,請使用Include();

另外,見下文鏈接:

從Entity Framework 6中獲得更多性能

實體框架加載相關實體

配置一對多關係

EF Core中的關係


熱門答案

使用當前的實體結構,您可以在所有三個數據集之間編寫連接,然後在DeckId上執行分組並派生結果。

我將為我的視圖為此分組數據表示創建2個視圖模型類。

public class DeckVm
{
    public int Id { set; get; }
    public string Name { set; get; }
    public IEnumerable<CardVm> Cards { set; get; }
}
public class CardVm
{
    public int Id { set; get; }
    public string Name { set; get; }
}

現在加入

var decksWithCards = (from dc in db.DeckCards
                join d in db.Decks on dc.DeckID equals d.ID
                join c in db.Cards on dc.CardID equals c.ID
                select new { DeckId = d.ID, DeckName = d.Name,
                             CardId = c.ID, CardName = c.Name })
    .GroupBy(x => x.DeckId, d => d,
        (ky, v) =>
            new DeckVm
            {
                Id = ky,
                Name = v.FirstOrDefault().DeckName,
                Cards = v.Select(h => new CardVm { Id = h.CardId, Name=h.CardName})
            })
    .ToList();

decksWithCards將是一個List<DeckVm> ,您可以將其傳遞給您的視圖。您必須使您的視圖強烈鍵入List<DeckVm>



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow