渴望加载 - MVC

时间:2017-05-01 08:36:03

标签: asp.net-mvc eager-loading

我有2个模特:(1)FamiliaMáquina(PK:FamiliaId)和(2)TipoMáquina(PK:TipoMáquinaId)。 它们之间的关系是:TipoMáquina只能关联1个FamiliaId,而FamiliaMáquina可以有许多关联的TipoMáquinaId(一对多关系)。

FamiliaMáquina定义:

        public class FamiliaMáquina
        {
            [Key, Required]
            public int FamiliaId { get; set; }
            public string DescripciónFamilia { get; set; }

            public virtual ICollection<TipoMáquina> TipoMáquina { get; set; }

        }

TipoMáquina定义:

public class TipoMáquina
    {
        [Key, Required]
        public int TipoMáquinaId { get; set; }
        public string DescripciónTipoMáq { get; set; }
        public int FamiliaId { get; set; }

        public virtual FamiliaMáquina FamiliaMáquina { get; set; }

    }

目标:显示,编程FamiliaMáquina控制器,FamiliaId(来自模型1)和DescripciónTipoMáq(来自模型2)的相关联列表。为此,表格中已填充了样本数据。

在FamiliaMaqController上(关联发生的地方 - 急切加载):

public class FamiliaMaqController : Controller
    {
        private ApplicationDbContext _context;

        public FamiliaMaqController()
        {
            _context = new ApplicationDbContext();
        }

        protected override void Dispose(bool disposing)
        {_context.Dispose();}

        public async Task<ActionResult> NuevaMQ()
        {
            var fammáquinas = _context.FamiliaMáquinas.Include(c => c.TipoMáquina).AsNoTracking();


            return View(await fammáquinas.ToListAsync());
        }
    }

这是在NuevaMQ.cshtml上展示的。 NuevaMQ代码是:

@model IEnumerable<Plataforma.Models.FamiliaMáquina>
@{
    ViewBag.Title = "NuevaMQ";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>NuevaMQ</h2>

<table class="table table-bordered table-hover">
    <thead>
        <tr>
            <th>Familia de Máquina</th>
            <th>Tipo de Máquina</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var fammáquinas in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => fammáquinas.FamiliaId)</td>
                <td>@Html.DisplayFor(modelItem => fammáquinas.TipoMáquina.DescripciónTipoMáq)</td>
            </tr>
        }
    </tbody>
</table>

我在这一行收到错误:

@Html.DisplayFor(modelItem => fammáquinas.TipoMáquina.DescripciónTipoMáq

据说,应列出FamiliaID和DescripciónTipoMáq,但是,我收到以下警告:

“ICollection没有'DescripciónTipoMáq'的定义。”

¿为什么不急切加载工作?我一直在努力解决这个问题。这就像这行代码:

var fammáquinas = _context.FamiliaMáquinas.Include(c => c.TipoMáquina).AsNoTracking();

没有关联表但我没有收到错误。 我在网站上得到的结果是:

FamiliaId:1 描述:System.Data.Entity.DynamicProxies.FamiliaMáquina_EB64915DB33A48C74F57D392EFE55D5AEDC5BF74BE67B819F4737EEB09B6F436

这与每个FamiliaId相关的项目重复次数。这就像程序正在按照它应该迭代但每次都获得该引用而不是字段值。

2 个答案:

答案 0 :(得分:2)

你在该行中有错误

@Html.DisplayFor(modelItem => fammáquinas.TipoMáquina.DescripciónTipoMáq)

因为基于FamiliaMáquina类的代码,您使用的是TipoMáquina,这是一个集合ICollection<TipoMáquina>。并ICollection<TipoMáquina>喜欢所有ICollection<T>并未定义错误所说的DescripciónTipoMáq属性:

  

ICollection没有'DescripciónTipoMáq'的定义。

因此,如果您不想获得描述,则需要遍历每个TipoMáquina项并显示DescripciónTipoMáq属性

旁注:避免使用带有重音的那种命名事项,因为您或其他开发人员可能会花费大量时间来了解代码无法编译的原因,并会在几分钟后发现他或她拼错了可变的名字。

答案 1 :(得分:0)

有效!

我已经用这种方式更改了控制器:

        public async Task<ActionResult> NuevaMQ()
        {
            var fammáquinas = _context.TipoMáquinas.Include(c => c.FamiliaMáquina).AsNoTracking();


            return View(await fammáquinas.ToListAsync());
        }

然后,我进入视图以相应地更改它,以便我可以从FamiliaMáquina调用数据并将FamiliaId打开:

    <tbody>
        @foreach (var fammáquinas in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => fammáquinas.FamiliaId)</td>
                <td>@@Html.DisplayFor(modelItem => fammáquinas.DescripciónTipoMáq)</td>
            </tr>
        }
    </tbody>

另外,更改了cshtml文件顶部的引用模型:

@model IEnumerable<Plataforma.Models.TipoMáquina>

结果,该表显示了从不同的表调用的两个属性:)感谢您的帮助!

相关问题