MVC4 Wyświetlenie danych wiele-do-wielu

Odpowiedz Nowy wątek
2013-11-13 12:36
0

Witam,

Tworzę niewielki projekt w MVC4, ale mam problem z relacjami wiele do wielu. Mianowicie utworzyłem bazę danych która wygląda tak:

user image

Oczywiście między tymi tabelami znajduje się tabela pomocnicza zawierająca ID_AN i ID_GE jako klucz podstawowy.
Stworzyłem o to taki model:

 namespace AnimeWeb.Models
{
    using System;
    using System.Collections.Generic;

    public partial class DetailsModel
    {
        public ANIME MyANIME { get; set; }
        public GENRES MyGENRES { get; set; }
    }
}

Następnie utworzyłem controller z ActionResult wyglądającym tak:

 public ActionResult Details(int id)
        {
            using (var db = new MainDatabaseEntities())
            {
                DetailsModel viewModel = new DetailsModel();

                viewModel.MyANIME = db.ANIME.FirstOrDefault(a => a.ID_AN == id);
                viewModel.MyCHARACTER = db.GENRES.FirstOrDefault(a => a.ID_CH == id);

                return View(viewModel);
            }
        } 

i na koniec do tego utworzyłem View:

 @model AnimeWeb.Models.DetailsModel

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<fieldset>
    <legend>DetailsModel</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.SMALL_PIC)
    </div>
    <div>
        <img src="../../Images/Anime/@Html.DisplayFor(model => model.MyANIME.SMALL_PIC)" height="314" width="225"> 
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.TITLE_OR)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.TITLE_OR)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.TITLE_EN)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.TITLE_EN)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.TYPE)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.TYPE)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.EPISODES)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.EPISODES)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.AIRED_START)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.AIRED_START)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.AIRED_END)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.AIRED_END)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.SYNOPSIS)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.SYNOPSIS)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.RATING)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.RATING)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.OP_THEME)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.OP_THEME)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.MyANIME.ED_THEME)
    </div>
    <div>
        @Html.DisplayFor(model => model.MyANIME.ED_THEME)
    </div>
</fieldset>
<p>
    @Html.ActionLink("Back to List", "Index")
</p>

Dane znajdujące się u góry wyświetlane są prawidłowo, ale za chiny teraz nie wiem jak wyświetlić wszystkie Gatunki przypisane do tego Anime. Przypuszczam, że muszę użyć pętli foreach, ale wtedy dostaję błąd, że model nie jest IEnumerable i nie wiem jak sobie z tym poradzić. Jakieś rady?

Pozostało 580 znaków

2013-11-13 17:47
86Michal86

Entity Framework obsługuje relacje wiele do wielu. Nie musisz specjalnie tworzyć dodatkowej tabeli. Ja zrobiłbym to tak:

Prawy klawisz na wolnym polu na schemacie i Add Code Generation Item i wybrał EF DBContext Generator. Utworzysz sobie przyjemne w użyciu encje. Następnie coś takiego:

Jak wyświetlić wszystkie Gatunki przypisane do tego Anime ?

using (var model = new WygenerowanyKontekst())
{
var ListaGatunkow = model.Anime.First(p=>p.ID_AN==5).GENRES;
}

ListaGatunków to lista typu ICollection<genres>. Zależnie od tego czy ustawiłeś Lazy Loading na entity frameworku (czy model ma pobierać obiekty podrzędne w przypadku relacji), dostaniesz wypełnioną, bądź pustą listę. Daj znać czy Ci pomogłem, pozdrawiam.

Pozostało 580 znaków

2013-11-13 19:31
0

Ehh, oczywiście modele tworzyłem przez EF DBGenerate Context. Nie sądziłem jednak, że obejdzie się bez dodatkowej tabeli. Jak zawsze najprostsze rozwiązania okazują się najlepsze. Dzięki za pomoc już wszystko działa.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0