none
Dúvida com EF - Entidade com duas FK de uma mesma entidade RRS feed

  • Pergunta

  • Caros. Boa noite.

     Tenho uma entidade chama UnidadeMedida e uma outra chamada UnidadeMedidaConversao(responsavel por gravar as conversões de unidade de medida dos productos).

    Não estou conseguindo chegar em um mapeamento bom para que quando eu faça a chamada da query com um .Include essa lista de UnidadeMedidaConversao venha junto com a Unidade de Medida.

    Por favor, espero achar uma solução aqui. Agradeço desde já.

    Segue as entidades com o mapeamento e a query.

    public class UnidadeMedida
        {
            public long Codigo { get; set; }
            public string Nome { get; set; }
            public string Sigla { get; set; }
            
            public virtual ICollection<UnidadeMedidaConversao> UnidadeMedidaConversao { get; set; } 
        }
    
        public class UnidadeMedidaEntityTypeConfiguration: EntityTypeConfiguration<UnidadeMedida>
        {
            public UnidadeMedidaEntityTypeConfiguration()
            {
                HasKey(c => c.Codigo);
                Property(c => c.Sigla).HasMaxLength(4);
                HasMany(c => c.UnidadeMedidaConversao).WithRequired(c => c.UnidadeMedidaOrigem);
            }
        }
    
    public class UnidadeMedidaConversao
        {
            public UnidadeMedidaConversao()
            {
                ProdutosVendemComConversao = false;
                ProdutosMovimentamComConversao = false;
            }
    
            public long UnidadeMedidaOrigem_Codigo { get; set; }
            public string UnidadeMedidaOrigem_Nome { get; set; }
            public decimal QuantidadeOrigem { get; set; }
            public long UnidadeMedidaDestino_Codigo { get; set; }
            public string UnidadeMedidaDestino_Nome { get; set; }
            public decimal QuantidadeDestino { get; set; }
            public bool ProdutosVendemComConversao { get; set; }
            public bool ProdutosMovimentamComConversao { get; set; }
    
            public virtual UnidadeMedida UnidadeMedidaOrigem { get; set; }
            public virtual UnidadeMedida UnidadeMedidaDestino { get; set; }
        }
    
        public class UnidadeMedidaConversaoEntityTypeConfiguration: EntityTypeConfiguration<UnidadeMedidaConversao>
        {
            public UnidadeMedidaConversaoEntityTypeConfiguration()
            {
                HasKey(c => new { c.UnidadeMedidaOrigem_Codigo, c.UnidadeMedidaDestino_Codigo });
                HasRequired(c => c.UnidadeMedidaOrigem).WithMany()
                                                       .HasForeignKey(c => c.UnidadeMedidaOrigem_Codigo).WillCascadeOnDelete(false);
                HasRequired(c => c.UnidadeMedidaDestino).WithMany()
                                                        .HasForeignKey(c => c.UnidadeMedidaDestino_Codigo).WillCascadeOnDelete(false);
                Ignore(c => c.UnidadeMedidaOrigem_Nome);
                Ignore(c => c.UnidadeMedidaDestino_Nome);
            }
        }
    
    Repository:
    
    public UnidadeMedida Obter(Expression<Func<UnidadeMedida, bool>> filter, Func<IQueryable<UnidadeMedida>, IOrderedQueryable<UnidadeMedida>> paOrderBy = null, string[] paIncluirPropriedades = null)
            {
                using (var _context = new DataContexto())
                {
                    var query = QueryConfigurar(_context.Set<UnidadeMedida>().AsQueryable(), filter, paOrderBy, paIncluirPropriedades);
                    var _retorno = query.First();
                    //_retorno.UnidadeMedidaConversao = _context.Set<UnidadeMedidaConversao>()
                    //                                          .Include("UnidadeMedidaOrigem")
                    //                                          .Include("UnidadeMedidaDestino")
                    //                                          .Where(c => c.UnidadeMedidaOrigem_Codigo == _retorno.Codigo).ToList();
                    //_retorno.UnidadeMedidaConversao.ToList().ForEach(c => c.UnidadeMedidaOrigem_Nome = c.UnidadeMedidaOrigem.Nome);
                    //_retorno.UnidadeMedidaConversao.ToList().ForEach(c => c.UnidadeMedidaDestino_Nome = c.UnidadeMedidaDestino.Nome);
    
                    _context.Dispose();
    
                    return _retorno;
                }
            }

    quinta-feira, 16 de junho de 2016 22:39

Respostas

  • Utilize um inner join, ou caso seja um retorno não obrigatório, utilize o left join ao inves do include

    from  UnidadeMedidaConversao = _context.Set<UnidadeMedidaConversao>()

      join UnidadeMedidaOrigemin _db.Set<UnidadeMedidaOrigem>()
                                                 on UnidadeMedidaConversao equals UnidadeMedidaOrigemin .ID da Tabela
                                                from UnidadeMedidaOrigemin in comp.DefaultIfEmpty()

                                              join UnidadeMedidaDestino_db.Set<UnidadeMedidaDestino>()
                                                 on UnidadeMedidaConversao equals UnidadeMedidaDestino.ID da Tabela
                                                from UnidadeMedidaDestinoin comp.DefaultIfEmpty()
    • Marcado como Resposta Diogo Areas quarta-feira, 26 de outubro de 2016 14:31
    quinta-feira, 21 de julho de 2016 19:53

Todas as Respostas

  • Utilize um inner join, ou caso seja um retorno não obrigatório, utilize o left join ao inves do include

    from  UnidadeMedidaConversao = _context.Set<UnidadeMedidaConversao>()

      join UnidadeMedidaOrigemin _db.Set<UnidadeMedidaOrigem>()
                                                 on UnidadeMedidaConversao equals UnidadeMedidaOrigemin .ID da Tabela
                                                from UnidadeMedidaOrigemin in comp.DefaultIfEmpty()

                                              join UnidadeMedidaDestino_db.Set<UnidadeMedidaDestino>()
                                                 on UnidadeMedidaConversao equals UnidadeMedidaDestino.ID da Tabela
                                                from UnidadeMedidaDestinoin comp.DefaultIfEmpty()
    • Marcado como Resposta Diogo Areas quarta-feira, 26 de outubro de 2016 14:31
    quinta-feira, 21 de julho de 2016 19:53
  • Caro Alexandre.

    Obrigado pela ajuda, mas consegui resolver pelo entity sem usar o linq.

    Como a entidade das duas FKs é a mesma o EF se perdia. MAs consegui contornar.

    Obrigado.

    quarta-feira, 26 de outubro de 2016 14:31