Сопоставление сущности oneToMany с беглым nhibernate
Проблема кажется простой, однако у меня так много проблем, когда я пытаюсь отобразить эти объекты. Я просто не вижу, что я делаю не так. Ребята, вы можете мне помочь?
У меня есть классCliente
:
public class Cliente
{
public Cliente () { }
public virtual int ClienteId { get; set; }
public IList<Medidor> ListaMedidores { get; set; }
public virtual string NumeroMedidor { get; set; }
}
И классMedidor
public class Medidor
{
public Medidor() { }
public virtual string NumeroMedidor { get; set; }
public virtual string MarcaMedidor { get; set; }
public virtual Cliente Cliente { get; set; }
}
Я пытался сопоставить, как это
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");
}
Цель состоит в том, чтобы принести мой списокMedidor
согласно базе данных. Так я и сделал:
Session.Query<Cliente>().Fetch(x => x.ListaMedidores).ToList();
И я получаю список всегда пустым. Даже имея данные в этих таблицах ... Я был бы признателен за любую помощь или предложение.
С уважением
РЕДАКТИРОВАТЬМоя база данных выглядит так:
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) )
Учитывая sqlselect * from cliente where core_numero_medidor = '3569371'
:
CORE_ID CORE_NUMERO_MEDIDOR
123 3569371
и sqlselect * from MEDIDOR where numero_medidor = '3569371'
:
NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 kia
3569371 FIAT
Так что я предполагаю получить 3 элемента на моемIList<Medidor> Lista Medidores
наCliente
учебный класс..
РЕДАКТИРОВАТЬ
Я изменил на это:
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; }
}
И изменил картуClienteMap
чтобы:
Map(x => x.NumeroMedidor).Column("NUMERO_MEDIDOR");
HasMany(x => x.ListaMedid)
.KeyColumns.Add("NUMERO_MEDIDOR")
.Table("MEDID")
.PropertyRef("CoreNumeroCliente")
.Cascade.All();
и теперь список получает ожидаемое количество записей, но все они такие же, как и первая. то есть:
ожидаемый
NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 kia
3569371 FIAT
Мой результат
NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 general_motors
3569371 general_motors
Какие-либо предложения? Я бы хотел поблагодарить @Radim Köhler за помощь.
ДРУГОЕ РЕДАКТИРОВАНИЕ
Я нашел решение!
Я пытался отобразить неуникальный столбец как первичный ключ ... Я просто изменил столбец на настоящий первичный ключ и работал!
Итак, вот решение
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
}
}
И вот мой запрос:
Session.Query<CorteReligacao>()
.Fetch(x => x.ListaMedid)
Я действительно хотел бы поблагодарить Радима Келера за помощь. Его терпение, внимание и готовность помочь решить проблему оставляет мне недостаток благодарности ... Я могу только пожелать ему всего наилучшего в жизни.
И я очень надеюсь, что эта тема может помочь людям с той же проблемой.
С уважением.