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が含まれている私の見解では
:
おかげ
「Aplicacao」を見つけるのは非常に非効率的な方法です。最初に取得するリスト全体ではなく、データベースから直接クエリを実行する必要があります。しかし、トピック:あなたのモデルとクエリには何も問題はないようです。実行されたSQLをチェックしましたか? –
@Gert、私は別のクエリでAplicacaoにクエリを行い、ビューにそれらを結合するにはどうすればよいですか?各プロドゥートには多くのアプリカカオ族がいます。 DBから取得したすべてのデータを結合するためにビューモデルを使用する必要がありますか? – JDalri