gpt4 book ai didi

c# - 使用流利的 nhibernate 映射实体 oneToMany

转载 作者:行者123 更新时间:2023-11-30 16:07:01 24 4
gpt4 key购买 nike

问题看起来很简单,但是我在尝试映射这些实体时遇到了很多麻烦。我只是看不出我做错了什么。你们能帮帮我吗?

我有课 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))

Given the sql select * from cliente where core_numero_medidor = '3569371':

CORE_ID CORE_NUMERO_MEDIDOR
123 3569371

和 sql select * from MEDIDOR where numero_medidor = '3569371' :

NUMERO_MEDIDOR MARCA_MEDIDOR
3569371 general_motors
3569371 kia
3569371 FIAT

所以我想在我的 IList<Medidor> Lista Medidores 上得到 3 个元素在 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 到:

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)

非常感谢 Radim Köhler 的帮助。他的耐心、关注和帮助解决问题的意愿让我无法表达感谢。我只能祝他生活一切顺利。

我真的希望这个帖子可以帮助遇到同样问题的人。

问候。

最佳答案

one-to-manymany-to-one始终由一列相关。这是这样的列,其中包含对其他表/实体的引用 ID(外键)。

在我们的例子中,它必须是 Medidor 表中的列,它的名字将是 "CORE_NUMERO_MEDIDOR" 。映射应该是这样的

public ClienteMap()
{
...
HasMany(x => x.ListaMedidores)
//.KeyColumn("NUMERO_MEDIDOR")
.KeyColumn("CORE_NUMERO_MEDIDOR") // column in other table
.Inverse().Cascade.All();
}


public MedidorMap()
{
...
References(x => x.Cliente)
.Column("CORE_NUMERO_MEDIDOR"); // column in this table
}

扩展

基于扩展问题,什么时候可以看到表的这种结构

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)
)

DB 引用与 C# 中的不同。看起来,如果

table CLIENTE references just one MEDIDOR, while MEDIDOR has many CLIENTEs.

看起来对象应该是这样的:

public class Cliente
{
...
//public IList<Medidor> ListaMedidores { get; set; }
//public Medidor Medidor { get; set; }
}

public class Medidor
{
...
//public virtual Cliente Cliente { get; set; }
public virtual IList<Cliente> Clientes { get; set; }
}

映射应该是

public ClienteMap()
{
...
References(x => x.Medidor, "CORE_NUMERO_MEDIDOR");
}


public MedidorMap()
{
...
Id(x => x.NumeroMedidor).Column("NUMERO_MEDIDOR")
// column in this table to be compared
HasMany(x => x.Clientes)
.KeyColumn("CORE_NUMERO_MEDIDOR") // with column in other table
.Inverse().Cascade.All();
}

另一个扩展

因为第二个表 MEDIDOR 没有自己的主键(列 NUMERO_MEDIDOR)但它可能包含许多相同的值...来自 CLIENT TABLE...我们应该使用组件映射

public ClienteMap()
{
...
Map(x => x.NumeroMedidor).Column("CORE_NUMERO_MEDIDOR");
HasMany(x => x.ListaMedidores)
.Component(com =>
{
com.Parent(y => y.Cliente, "NUMERO_MEDIDOR")
.PropertyRef("NumeroMedidor")
;
com.Map(y => y.MarcaMedidor, "MARCA_MEDIDOR");
})
.PropertyRef("NumeroMedidor")
.Table("MEDIDOR")
// .Inverse() // NO INVERSE, won't work
.Cascade.All();

}

关于c# - 使用流利的 nhibernate 映射实体 oneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31292259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com