【问题标题】:Entity framework retrieve all data for a model that has many many-to-many relationships实体框架检索具有多对多关系的模型的所有数据
【发布时间】:2016-03-31 14:56:29
【问题描述】:

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

例如:一个产品可以有多个应用程序,一个应用程序可以属于多个产品;
一个 Produto 可以有多个 Opcionais,一个 Opcional 可以属于多个 Produtos;

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

我的问题是检索所有这些数据。当我只用它的 Aplicacao 查询 Produto 时,它可以工作,但我不知道如何在其中加入相关的 Opcional。

产品

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

应用

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

可选

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

上下文

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 以及它们与 Aplicacao 和 Opcional 相关的内容,以便在我的索引视图中显示它们?

【问题讨论】:

  • 向我们展示您尝试过的查询。

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


【解决方案1】:

您可以使用 linq to 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; }
}

【讨论】:

  • 谢谢,这解决了我的问题。我使用延迟加载对我有什么好处吗?它更具表现力?谢谢
  • 我不会使用延迟加载,它的性能比预加载要差。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多