【发布时间】:2016-03-31 21:31:37
【问题描述】:
我在 ASP.NET MVC 5 和 Entity Framework 6 中遇到了一些问题。
我的应用程序有 PRODUTO,而这些有 APLICACAO。
一个PRODUTO可以有多个APLICACAO,一个APLICACAO可以属于多个PRODUTO。所以,这是一个多对多的关系。
一些信息:
产品
public class Produto
{
public int Id { get; set; }
public string Nome { get; set; }
public string Descricao { get; set; }
public ICollection<Aplicacao> Aplicacoes { get; set; }
}
应用
public class Aplicacao
{
public int Id { get; set; }
public string Nome { get; set; }
public ICollection<Produto> Produtos { get; set; }
}
在上下文中我设置了 DbSets 和 Fluent API
public DbSet<Produto> Produtos { get; set; }
public DbSet<Aplicacao> Aplicacoes { get; set; }
modelBuilder.Entity<Produto>()
.HasMany(c => c.Aplicacoes)
.WithMany(p => p.Produtos)
.Map(
m =>
{
m.MapLeftKey("ProdutoId");
m.MapRightKey("AplicacaoId");
m.ToTable("ProdutoAplicacao");
});
比 EF 创建表和桥表,到目前为止一切顺利。
在我的初始化程序中,我创建了一个这样的产品:
var app = context.Aplicacoes.ToList().Find(a => a.Nome == "Industrial");
var app2 = context.Aplicacoes.ToList().Find(a => a.Nome == "Betoneiras");
var produto = new Produto {Nome = "Produto 1", Descricao = "Descrição", Aplicacoes = new List<Aplicacao>{app, app2}};
context.Produtos.Add(produto);
然后,EF 填充 APLICACAO 和 PRODUTO 表,同时填充 PRODUTOAPLICACAO 表。
但是,当我尝试在我的产品索引视图中加载这些信息时,应用程序是空的,我不知道如何解决这个问题。
产品控制器
public ActionResult Index()
{
return View(db.Produtos.Include(x => x.Aplicacoes.Select(y => y.Produtos)).ToList());
}
索引视图
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Nome)
</th>
<th>
@Html.DisplayNameFor(model => model.Descricao)
</th>
<th>
@Html.DisplayNameFor(model => model.Aplicacoes)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Nome)
</td>
<td>
@Html.DisplayFor(modelItem => item.Descricao)
</td>
<td>
@Html.DisplayFor(modelItem => item.Aplicacoes)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
我需要帮助来修复检索视图模型的查询,以便我可以在我的索引视图中显示与一个产品相关的每个 Aplicacao 的名称。
谢谢
【问题讨论】:
-
顺便说一句,找到
Aplicacao的效率很低。您应该直接从数据库中查询它,而不是从您首先获得的整个列表中查询。但主题是:您的模型和查询似乎没有错。你检查执行的 SQL 了吗? -
@Gert,我在另一个查询中查询 Aplicacao,我该如何将它们加入视图?每个 Produto 可以有许多 Aplicacao。我必须使用视图模型来加入从数据库中检索到的所有数据?
标签: c# asp.net-mvc entity-framework many-to-many