RELACIONAMENTO 1 PARA MUITOS
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:
Estou fazendo a seguinte consulta
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?
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?
Tem que usar o tal do [Ô]Include[Ô]
https://ferhenriquef.com/2012/03/19/uso-de-include-em-consultas-com-o-entity-framework-code-first/
https://ferhenriquef.com/2012/03/19/uso-de-include-em-consultas-com-o-entity-framework-code-first/
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?
Cara, acredito que só usando Reflection mesmo para isso.
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;
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;
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?
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