急切加载-MVC

Eager Loading - MVC

我有 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 doesn't have a definition for 'DescripciónTipoMáq'."

¿为什么预加载不起作用?我已经为此苦苦挣扎了一段时间。就像这行代码:

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

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

家庭编号:1 DescriptionTipoMáq: System.Data.Entity.DynamicProxies.FamiliaMáquina_EB64915DB33A48C74F57D392EFE55D5AEDC5BF74BE67B819F4737EEB09B6F436

这与每个 FamiliaId 相关的项目一样重复。这就像程序正在按预期进行迭代,但每次都获取该引用而不是字段值。

你在那一行有错误

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

因为根据 FamiliaMáquina class 的代码,您正在使用 TipoMáquina,这是一个集合 ICollection<TipoMáquina>ICollection<TipoMáquina> likee all ICollection<T> 没有定义 DescripciónTipoMáq 属性 这就是错误所说的:

ICollection doesn't have a definition for 'DescripciónTipoMáq'.

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

旁注: 避免使用带有重音符号的命名方式,因为您或其他开发人员可能会浪费很多时间来了解为什么代码无法编译并会找到几分钟后,他或她拼错了变量的名称。

成功了!

我是这样换控制器的:

        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>

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