Usuário com melhor resposta
Dúvida com EF - Entidade com duas FK de uma mesma entidade

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