实体框架检索具有许多多对多关系的模型的所有数据

时间:2016-03-31 14:56:30

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

我有一个主要模型Produto,这个模型与其他模型有一些多对多的关系。

例如:一个产品可以有许多Aplicacoes,一个Aplicacao可以属于许多Produtos;
一个产品可以有许多Opcionais,一个Opcional可以属于许多Produtos;

我想在索引视图中显示我的所有Produto,并将它们与Aplicacao和Opcional相关联。

我的问题是检索所有这些数据。当我只使用它的Aplicacao查询Produto时,它有效,但我不知道如何加入相关的Opcional。

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 ICollection<Opcional> Opcionais { get; set; }
}

Aplicacao

public class Aplicacao
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public ICollection<Produto> Produtos { get; set; }
}

Opcional

public class Opcional
{
    public int Id { get; set; }
    public string Descricao { get; set; }
    public ICollection<Produto> Produtos { get; set; }
}

Contexto

public DbSet<Produto> Produtos { get; set; }
public DbSet<Aplicacao> Aplicacoes { get; set; }
public DbSet<Opcional> Opcionais { get; set; }

modelBuilder.Entity<Produto>()
            .HasMany(c => c.Aplicacoes)
            .WithMany(p => p.Produtos)
            .Map(
                m =>
                     {
                         m.MapLeftKey("ProdutoId");
                         m.MapRightKey("AplicacaoId");
                         m.ToTable("ProdutoAplicacao");
                     });

        modelBuilder.Entity<Produto>()
            .HasMany(c => c.Opcionais)
            .WithMany(p => p.Produtos)
            .Map(
                m =>
                {
                    m.MapLeftKey("ProdutoId");
                    m.MapRightKey("OpcionalId");
                    m.ToTable("ProdutoOpcional");
                });

我想知道如何查询所有Produto,他们从DB中关联Aplicacao和Opcional,以便我可以在我的索引视图中显示它们?

1 个答案:

答案 0 :(得分:2)

您可以使用linq将关联实体加载到Entity keyworkd Include()。这将加载Producto和所有相关的Aplicacoes和Opcionais:

var productosList = MyDbContext.Produtos.Include(x => x.Aplicacoes)
                                        .Include(x => x.Opcionais).ToList();

或者通过使用关键字virtual:

装饰您的实体类来延迟加载相关实体
public class Produto
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public string Descricao { get; set; }
    public virtual ICollection<Aplicacao> Aplicacoes { get; set; }
    public virtual ICollection<Opcional> Opcionais { get; set; }
}