急切加载 - MVC



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

家族马奎纳定义:

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; }
}

蒂波马奎纳定义:

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();

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

家庭编号: 1 DescripciónTipoMáq: System.Data.Entity.DynamicProxies.FamiliaMáquina_EB64915DB33A48C74F57D392EFE55D5AEDC5BF74BE67B819F4737EEB09B6F436

这重复的次数与每个家庭ID相关的项目一样多。这就像程序正在按应有的方式迭代,但每次都获取该引用而不是字段值。

那行有错误

@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属性

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

它奏效了!

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

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>

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

最新更新