【问题标题】:Working with EF 6 MVC 5 and retrieving data from many-to-many relationship使用 EF 6 MVC 5 并从多对多关系中检索数据
【发布时间】: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


【解决方案1】:

在@Gert Arnold 评论我的查询是正确的之后,我发现了“错误”:

在我看来,我已经为从 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>
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多