2017-01-08 2 views
1

У меня есть эти три модели:Как сделать таблицы объединения с использованием основного кода EF первый

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. Может ли кто-нибудь дать мне указания или указать мне в правильном направлении?

Обратите внимание, что таблица карты представляет собой статическую таблицу (я не знаю, правильно ли это для нее, но она будет заполнена и оставлена ​​без изменений с любыми картами, которые есть в настоящее время в игре (это веб-сайт для создания колоды)).

+1

что конкретно вы хотите, как присоединиться к результату? Что вы пробовали? – Shyju

+0

Я хочу, чтобы результат объединения был сущностью типа DeckCard. Извините меня, если это звучит глупо, но я очень к этому не знаком. – tocoolforscool

+0

Вы хотите использовать конкретную колоду? (DeckId .. ???). – Shyju

ответ

3

Первый. Вам не нужно создавать модель (DeckCard) для одного или нескольких отношений, чтобы EF автоматически создавал эту таблицу в вашей базе данных.

Второй. Добавить или overrid OnModelCreating метода в DbContext классе Для примера:

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

Для присоединиться запросом с жадной загрузкой л использование Include();

также смотрите ниже ссылки:

Getting more performance out of Entity Framework 6

Entity Framework Loading Related Entities

Configure One-to-Many Relationship

Relationships In EF Core

+0

Я использую ядро ​​EF, и я собираюсь изменить заголовок, чтобы указать его, но «.HasRequired» не является методом любой директивы, которую я использую , Есть ли эквивалент ядра? Является ли этот код установлением отношения «один ко многим», это не тот, который предполагается EF при определении свойства nav (общедоступный виртуальный ICollection Cards {get; set;} объект типа Card с идентификатором свойства будет автоматически сопоставлен с сущность с определением свойства nav ... Правильно? – tocoolforscool

+0

В отношениях 1 к многим 1 - это карта, а многие - это колода вправо? В соответствии с этим кодом? – tocoolforscool

+0

@ j3ssi3ftw да, подумайте об этом [link] (https: //docs.microsoft.com/en-us/ef/core/modeling/relationships) отлично подходит для вашей проблемы. –

1

С вашей текущей структурой сущности вы можете написать соединение между всеми тремя наборами данных, а затем сделать группу на 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>

Смежные вопросы