2016-03-30 60 views
0

我在ASP.NET MVC 5和Entity Framework 6中遇到了一些麻煩。
我的應用程序有PRODUTO,它們有APLICACAO。
一個PRODUTO可以有許多APLICACAO,一個APLICACAO可以屬於很多PRODUTO。所以,這是一種多對多的關係。使用EF 6 MVC 5和檢索多對多關係中的數據

一些信息:

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和流利的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創建表的d橋表,迄今爲止非常好。

在我的初始化程序,我創建了一個產品像這樣:

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

但是,當我嘗試在產品的索引視圖中加載這些信息時,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> 

我需要幫助修復retrive模型視圖的查詢,以便我可以顯示有關各一個Aplicacao的名字產品放入我的索引視圖。

感謝

+0

順便說一句,這是一個相當低效的方法找到一個'Aplicacao'。你應該直接從數據庫中查詢它,而不是從你首先得到的整個列表中查詢。但話題上:你的模型和查詢沒有什麼問題。你檢查執行的SQL嗎? –

+0

@Gert,我在另一個查詢中查詢Aplicacao,我該如何將它們加入視圖?每個Produto可以有很多Aplicacao。 我必須使用視圖模型來加入從數據庫中檢索的所有數據? – JDalri

回答

0

@Gert阿諾德評論說我的查詢是正確的,我發現了「錯誤」:在我看來

我已經包含了另一個的foreach從數據庫檢索到的Aplicacao的名字。現在我認爲它是這樣的:

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