RELACIONAMENTO 1 PARA MUITOS

MICHAELL 10/07/2016 21:14:09
#464694
Olá boa tarde Galera..

Não sei o que estou fazendo de errado...Tenho um relacionamento de Clientes que podem ter 0 ou muitos telefones.

Minhas entidades e relacionamento sao assim:

public class Cliente
{
public int ClienteID { get; set; }
public string Nome { get; set; }
public virtual ICollection<Telefone> Telefones { get; set; }

public Cliente()
{
Telefones = new List<Telefone>();
}
}

public class Telefone
{
public int TelefoneID { get; set; }
public string Fone { get; set; }
public int ClienteID { get; set; }
public virtual Cliente Cliente { get; set; }
}


public class TelefoneMap : EntityTypeConfiguration<Telefone>, IMapping
{
public TelefoneMap()
{
HasRequired(t => t.Cliente)
.WithMany(c => c.Telefones)
.HasForeignKey(t=> t.ClienteID)
.WillCascadeOnDelete(true);
}
}


Estou fazendo a seguinte consulta


public IQueryable<TEntity> Get()
{
return contexto.Set<TEntity>().AsExpandable().AsQueryable();
}
using (var repositorioClientes = new ClienteRepositorio())
{
cliente = repositorioClientes.Get().Where(c => c.ClienteID == id).SingleOrDefault(); // BUSCA CLIENTE
}



a busca do cliente acontece normalmente.
o objeto cliente fica com todas as propriedades.. menos a propriedade Telefones que fica com 0 registros

Ao fazer a busca de clientes não deveria já vir os telefones relacionados?
Já tentei com Configuration.LazyLoadingEnabled = true e também false

alguem sabe onde posso estar errando?
JABA 10/07/2016 22:29:46
#464697
Tem que usar o tal do [Ô]Include[Ô]

https://ferhenriquef.com/2012/03/19/uso-de-include-em-consultas-com-o-entity-framework-code-first/
MICHAELL 10/07/2016 23:34:17
#464699
Citação:

:
Tem que usar o tal do [Ô]Include[Ô]

https://ferhenriquef.com/2012/03/19/uso-de-include-em-consultas-com-o-entity-framework-code-first/



o problema é que estou fazendo consulta dinamica e mais genérica possível.. utilizando LinqKit

O Get esta dessa forma
public IQueryable<TEntity> Get()
{
return contexto.Set<TEntity>().AsExpandable().AsQueryable();
}

Observe o TEntity é onde recebe a entidade quando faço a consulta
cliente = repositorioClientes.Get().Where(c => c.ClienteID == id).SingleOrDefault();

com include ficaria assim:
return contexto.Set<TEntity>().Include([Ô]Telefones[Ô]).AsExpandable().AsQueryable();

Mas como faria esse include de forma generica assim como já faço com a Entidade principal?
JABA 10/07/2016 23:51:39
#464701
Cara, acredito que só usando Reflection mesmo para isso.
MICHAELL 11/07/2016 22:29:43
#464725
consegui apenas mudando um pouco a consulta

ao invés de:
cliente = repositorioClientes.Get().Where(c => c.ClienteID == id).SingleOrDefault(); // BUSCA CLIENTE

fiz assim:

cliente = repositorioClientes.Get().Where(c => c.ClienteID == id).Select(c => new { c, c.Telefones }).SingleOrDefault().c;
MICHAELL 22/07/2016 10:52:14
#465026
estou reativando esse tópico, foi acabei enfrentando outro problema nesse mesmo caso.

no caso, até consegui trazer os telefones relacionados com clientes.. mas e a entidade relacionada com Telefones já não funciona

tentei algo como

var query = repositorioClientes.Get().Where(c => c.ClienteID == id).Include([Ô]Telefones[Ô]).Include([Ô]CategoriaTelefones[Ô]).SingleOrDefault();

mas tanto telefone quanto categoria de telefones vem vazio

Eu deixei o Lazy e o Proxy desabilitado no contexto...assim:
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;

Se eu deixo ativado (true), ele trás todos os relacionamentos sem até mesmo dar INCLUDE..

porém, conforme li em vários sites e foruns que o recomendado é deixar false para não sobrecarregar o banco com consultas desnecessárias, o que acho válido.

Então queria saber como dar o include nessa minha consulta genérica.
Alguem pode dar uma dica?
Tópico encerrado , respostas não são mais permitidas