Mapeando a entidade oneToMany com nhibernate fluente
O problema parece ser simples, no entanto, estou tendo muitos problemas para tentar mapear essas entidades. Eu simplesmente não consigo ver o que estou fazendo de errado. Vocês podem me ajudar?
Eu tenho aulaCliente
:
public class Cliente
{
public Cliente () { }
public virtual int ClienteId { get; set; }
public IList<Medidor> ListaMedidores { get; set; }
public virtual string NumeroMedidor { get; set; }
}
E classeMedidor
public class Medidor
{
public Medidor() { }
public virtual string NumeroMedidor { get; set; }
public virtual string MarcaMedidor { get; set; }
public virtual Cliente Cliente { get; set; }
}
Eu tentei mapear assim
public ClienteMap()
{
Map(x => x.NumeroMedidor).Column("CORE_NUMERO_MEDIDOR");
HasMany(x => x.ListaMedidores)
.KeyColumn("NUMERO_MEDIDOR").Inverse().Cascade.All();
}
public MedidorMap()
{
Table("medidor");
LazyLoad();
Id(x => x.NumeroMedidor).Column("NUMERO_MEDIDOR");
Map(x => x.TipoMedidor).Column("TIPO_MEDIDOR");
References(x => x.Cliente).Column("CORE_NUMERO_MEDIDOR");
}
O objetivo é trazer minha lista deMedidor
de acordo com o banco de dados. Então eu fiz:
Session.Query<Cliente>().Fetch(x => x.ListaMedidores).ToList();
E eu estou ficando a lista sempre vazia. Mesmo tendo dados nessas tabelas ... eu apreciaria qualquer tipo de ajuda ou sugestão.
Saudações
EDITARMeu banco de dados é assim:
CREATE TABLE CLIENTE ( CORE_ID NUMBER NOT NULL, CORE_NUMERO_MEDIDOR VARCHAR2(50 BYTE) ) CREATE TABLE MEDIDOR ( NUMERO_MEDIDOR VARCHAR2(50 BYTE), MARCA_MEDIDOR VARCHAR2(50 BYTE) )
Dado o sqlselect * from cliente where core_numero_medidor = '3569371'
:
CORE_ID CORE_NUMERO_MEDIDOR
123 3569371
e o sqlselect * from MEDIDOR where numero_medidor = '3569371'
:
NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 kia
3569371 FIAT
Então, eu devo obter 3 elementos no meuIList<Medidor> Lista Medidores
emCliente
classe..
EDITAR
Eu mudei para isso:
public class Cliente
{
public Cliente () { }
public virtual int ClienteId { get; set; }
public IList<Medidor> ListaMedidores { get; set; }
public virtual string NumeroMedidor { get; set; }
}
public class Medidor
{
public Medidor() { }
public virtual string NumeroMedidor { get; set; }
public virtual string MarcaMedidor { get; set; }
}
E mudou o mapa deClienteMap
para:
Map(x => x.NumeroMedidor).Column("NUMERO_MEDIDOR");
HasMany(x => x.ListaMedid)
.KeyColumns.Add("NUMERO_MEDIDOR")
.Table("MEDID")
.PropertyRef("CoreNumeroCliente")
.Cascade.All();
e agora a lista obtém o número esperado de registros, mas todos são iguais ao primeiro. ou seja:
Esperado
NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 kia
3569371 FIAT
Meu resultado
NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 general_motors
3569371 general_motors
Alguma sugestão? Gostaria de agradecer a @Radim Köhler até agora pela ajuda.
OUTRA EDIÇÃO
Eu encontrei a solução!
Eu estava tentando mapear uma coluna não exclusiva como chave primária ... Acabei de alterar a coluna para uma chave primária real e funcionou!
Então agora aqui está a solução
public class Cliente
{
public Cliente () { }
public virtual int ClienteId { get; set; }
public IList<Medidor> ListaMedidores { get; set; }
public virtual string NumeroMedidor { get; set; }
}
public class Medidor
{
public Medidor() { }
public virtual string NumeroMedidor { get; set; }
public virtual string MarcaMedidor { get; set; }
}
public class ClienteMap : ClassMap<Cliente>
{
public ClienteMap()
{
Map(x => x.NumeroMedidor).Column("NUMERO_MEDIDOR");
HasMany(x => x.ListaMedid)
.KeyColumns.Add("NUMERO_MEDIDOR")
.Table("MEDID")
.PropertyRef("CoreNumeroCliente")
.Cascade.All();
}
}
public class MedidorMap : ClassMap<Medidor>
{
public MedidorMap()
{
LazyLoad();
Id(x => x.NumeroMedidor).Column("NUMERO_MEDIDOR");
Map(x => x.MarcaMedidor).Column("MARCA_MEDIDOR");
[...] //Other properties
}
}
E aqui está a minha consulta:
Session.Query<CorteReligacao>()
.Fetch(x => x.ListaMedid)
Eu realmente gostaria de agradecer a Radim Köhler pela ajuda. Sua paciência, atenção e vontade de ajudar a resolver o problema me deixam sem agradecimento. Só posso lhe desejar o melhor da vida.
E realmente espero que esse tópico possa ajudar pessoas com o mesmo problema.
Saudações.