使用EF 6 MVC 5并从多对多关系中检索数据

时间:2016-03-30 20:27:44

标签: c# asp.net-mvc entity-framework many-to-many

我在ASP.NET MVC 5和Entity Framework 6中遇到了一些麻烦 我的应用程序有PRODUTO,这些都有APLICACAO。
一个PRODUTO可以有许多APLICACAO,一个APLICACAO可以属于许多PRODUTO。所以,这是一种多对多的关系。

一些信息:

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

Aplicacao

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表。

但是,当我尝试在Product的Index视图中加载这些信息时,Aplicacoes是空的,我无法弄清楚如何解决这个问题。

ProdutoController

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的名称。

由于

1 个答案:

答案 0 :(得分:0)

在@Gert Arnold评论我的查询是对的之后,我发现&#34;错误&#34;:

在我看来,我已经包含了另一个从DB检索到的Aplicacao名称的foreach。现在我的观点是这样的:

<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>
            <ul>
                @foreach (var app in item.Aplicacoes)
                {
                    <li>@app.Nome</li>
                }
            </ul>
        </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>
}