具有相关数据的控制器 - 实体框架

时间:2016-12-02 00:05:02

标签: .net asp.net-mvc entity-framework linq

我尝试使用少量相关表格在我的视图信息中显示。我想展示来自&uzztkownik'的商品。选择“przedmioty'数据。 我有模特:

'przedmioty' ['idPrzedmiot']
'rolaPowWykladowca' ['idRolaPowWykladowca', 'idUzytkownik', 'idPrzedmiot', (...)]
'uzytkownik' ['idUzytkownik',(...)]

我尝试将控制器作为讲师控制器https://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

我创建了ViewModel:

public class PrzedmiotViewModel
{
    public IEnumerable<przedmioty> Przedmioty { get; set; }
    public IEnumerable<przedmiotPowWykladowca> PrzedmiotPowWykladowca { get; set; }
    public IEnumerable<uzytkownik> Uzytkownik { get; set; }
}

现在我的控制器看起来像:

    public ActionResult Index(int? PrzedmiotID, int? UzytkownikID, int? FormaZajecId)
    {
        var viewModel = new PrzedmiotViewModel();
        viewModel.Przedmioty = db.przedmioty;

        if (UzytkownikID != null)
        {
            ViewBag.idUzytkownik = UzytkownikID.Value;
            viewModel.Uzytkownik = viewModel.PrzedmiotPowWykladowca
                .Where(x => x.idUzytkownik == UzytkownikID).SingleOrDefault().uzytkownik;
        }

        return View(viewModel);
    }

错误是:

  

无法隐式转换类型&#39; Aplikacja.Models.uzytkownik&#39;到&#39; System.Collections.Generic.IEnumerable&lt; Aplikacja.Models.uzytkownik&gt;&#39;。存在显式转换(您是否错过了演员?)

我也试过这种方式:

        if (PrzedmiotID != null)
        {
            ViewBag.idPrzedmiot = PrzedmiotID.Value;

            viewModel.Uzytkownik = (from p in viewModel.Przedmioty
                                    where p.idPrzedmiot == PrzedmiotID
                                    select new
                                    {
                                        przedmioty = p,
                                        przedmiotPowWykladowca = (from pw in p.przedmiotPowWykladowca
                                                                  where pw.idPrzedmiot == PrzedmiotID
                                                                  select new
                                                                  {
                                                                      przedmiotPowWykladowca = pw,
                                                                      uzytkownik = from u in pw.idUzytkownik == u.idUzytkownik  
                                                                                   select u
                                                                  })
                                    }).Single().uzytkownik;
        }

但是

  

u(在u.idUzytkownik中)在curent上下文中不存在

我认为好的方式或我的想法总体上是错误的?

--- --- EDIT

        if (PrzedmiotID != null)
        {
            ViewBag.idPrzedmiot = PrzedmiotID.Value;
            var selectedPrzedmiotPowWykladowca = viewModel.PrzedmiotPowWykladowca
            .Where(x => x.idPrzedmiot == PrzedmiotID).ToList();

            db.Entry(selectedPrzedmiotPowWykladowca).Collection(x => x.uzytkownik).Load();
            foreach (uzytkownik uzytkownik in selectedPrzedmiotPowWykladowca.uzytkownik)
            {
                db.Entry(uzytkownik).Reference(x => x.rola).Load();
            }

            viewModel.Uzytkownik = selectedPrzedmiotPowWykladowca.uzytkownik;
        }

我做了类似的事情,但仍有错误:

  

错误CS1061&#39;列表&#39;不包含&#39; uzytkownik&#39;的定义没有扩展方法&#39; uzytkownik&#39;接受类型&#39; List&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

- 编辑 -

        if (PrzedmiotID != null)
        {
            ViewBag.idPrzedmiot = PrzedmiotID.Value;

            var viewUzytkownik = new PrzedmiotViewModel();
            viewUzytkownik.PrzedmiotPowWykladowca = db.przedmiotPowWykladowca.Where(x => x.idPrzedmiot == PrzedmiotID)
                .Include(x => x.uzytkownik);

            return View(viewUzytkownik);

这是这部分的观点:

@foreach (var przedmioty in Model.Przedmioty)
{
    @foreach (var uzytkownik in Model.Uzytkownik)
    {
        string selectedRow = "";
        if (przedmioty.idPrzedmiot == ViewBag.idPrzedmiot)
        {
            selectedRow = "selectedrow";
        }
        <tr clss="@selectedRow">
            <td>
                @Html.ActionLink("Wybierz", "Index", new { idUzytkownik = uzytkownik.idUzytkownik })
            </td>
            <td>
                @uzytkownik.imie
            </td>
            <td>
                @uzytkownik.nazwisko
            </td>
        </tr>
    }
}

没有错误,但它不起作用 - 我的意思是在选择&#39; przedmioty&#39;之后。视图不显示来自&u; | uzytkownik&#39;(idPrzedmiot在选择后显示)的记录。知道它为什么不起作用吗?

2 个答案:

答案 0 :(得分:0)

我看到两个可能的错误原因。 Uzytkownik属性的类型为'Aplikacja.Models.uzytkownik',或者您的模型声明属于'Aplikacja.Models.uzytkownik'类型。只需查看异常堆栈跟踪了解更多详细信息。

答案 1 :(得分:0)

我在那里做了linq查询:

    public ActionResult Details(int? PrzedmiotID)
    {
        if (PrzedmiotID == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        var wykladowcy = from p in db.przedmioty
                         join ppw in db.przedmiotPowWykladowca on p.idPrzedmiot equals ppw.idPrzedmiot
                         join f in db.formaZajec on ppw.idFormaZajec equals f.idFormaZajec
                         join u in db.uzytkownik on ppw.idUzytkownik equals u.idUzytkownik                            
                         where ppw.idPrzedmiot == PrzedmiotID.Value
                         select new PrzedmiotViewModel { Przedmioty = p, PrzedmiotPowWykladowca = ppw, Uzytkownik = u, FormaZajec = f};
        if (wykladowcy == null)
        {
            return HttpNotFound();
        }
        return View(wykladowcy);
    }

我将视图模型更改为:

public class PrzedmiotViewModel
{
    public przedmioty Przedmioty { get; set; }
    public przedmiotPowWykladowca PrzedmiotPowWykladowca { get; set; }
    public uzytkownik Uzytkownik { get; set; }
    public formaZajec FormaZajec { get; set; }
}

在视图中我添加:

@model IEnumerable<Aplikacja.ViewModels.PrzedmiotViewModel> 

希望如果有人遇到类似问题会有所帮助:)