【问题标题】:Eager Loading - MVC急切加载 - MVC
【发布时间】:2017-05-01 08:36:03
【问题描述】:

我有 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 没有 'DescriptionTipoMáq' 的定义。”

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc eager-loading


    【解决方案1】:

    你在那一行有错误

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

    因为基于FamiliaMáquina 类的代码,您正在使用TipoMáquina,它是一个集合ICollection&lt;TipoMáquina&gt;。而ICollection&lt;TipoMáquina&gt; likee all ICollection&lt;T&gt; 没有定义 DescripciónTipoMáq 属性,这就是错误所说的:

    ICollection 没有“DescriptionTipoMáq”的定义。

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

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

    【讨论】:

    • 感谢您的回复。我是 mvc 的新手,我通过指南和视频学习。我很难遍历每个 TipoMaquina 并每次都调用它们的描述。我应该如何编辑这种情况下的代码?
    • 您需要在第一个 foreach 中创建另一个 foreach。或者您可以修改您的操作方法以返回 TipoMáquina 的集合,而不是 FamiliaMáquinas。在您的代码中,只需使用 => var query = _context.TipoMáquinas.Include(c =&gt; c.FamiliaMáquina).AsNoTracking(); 并将其返回到 hte 视图,如下所示:return View(await query.ToListAsync()); 不要忘记更改视图模型。
    • 谢谢你明天早上试一试并分享结果,以防将来对某人有所帮助。
    • @LuisAlbertoDelgadodelaFlo 你测试了吗?有用吗?
    • 您好!是的,它有效,我在下面发布了更改。谢谢先生。
    【解决方案2】:

    成功了!

    我以这种方式更改了控制器:

            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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 2013-04-13
      • 2014-08-13
      • 2021-04-23
      相关资源
      最近更新 更多