2016-03-30 15 views
0

ASP.NET MVC 5およびEntity Framework 6に問題があります。
私のアプリケーションにはPRODUTOがあり、これらにはAPLICACAOがあります。
1つのPRODUTOは多くのAPLICACAOを持つことができ、1つの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; } 
} 

EFは、テーブルを作成したより私はAN 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"); 
         }); 

を設定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はまた、PRODUTOAPLICACAOテーブルを移入し、APLICACAOとPRODUTOテーブルに移入されます。

しかし、これらの情報を製品のインデックスビューに読み込もうとすると、Aplicacoesは空であり、これを修正する方法がわかりません。

私は私は1つに関連している各Aplicacaoの名前を表示できるように表示するためのモデルをretriveクエリを修正するために支援が必要なProdutoController

public ActionResult Index() 
    { 
     return View(db.Produtos.Include(x => x.Aplicacoes.Select(y => y.Produtos)).ToList()); 
    } 

Indexビュー

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

製品をインデックスビューに追加します。私はDBから取得したAplicacaoの名前のための別のforeachが含まれている私の見解では

おかげ

+0

「Aplicacao」を見つけるのは非常に非効率的な方法です。最初に取得するリスト全体ではなく、データベースから直接クエリを実行する必要があります。しかし、トピック:あなたのモデルとクエリには何も問題はないようです。実行されたSQLをチェックしましたか? –

+0

@Gert、私は別のクエリでAplicacaoにクエリを行い、ビューにそれらを結合するにはどうすればよいですか?各プロドゥートには多くのアプリカカオ族がいます。 DBから取得したすべてのデータを結合するためにビューモデルを使用する必要がありますか? – JDalri

答えて

0

私のクエリが正しかったことを@Gertアーノルドのコメントの後、私は「エラー」を見つけ。今、私の見解は次のようになります:

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