假设我有这个(简化)
班级客户
Id(v => v.numero_cliente,“numero_cliente”)
HasMany(v => v.Acionamentos).Cascade.All()。LazyLoad()
Class Movimentacao
参考文献(v => v.Cliente,“id_Fornecedor”)
Class Acionamento
参考文献(v => v.Cliente,“numero_cliente”)
Fluent nHibernate将生成错误的SQL,例如:
如果我试图获得Acionamentos,那么它将抛出一个不正确的SQL:
SELECT * FROM Acionamentos WHERE id_Fornecedor = p0
但是在我的Acionamento Mapping中,我设置了对名为 numero_cliente 的列的引用,而不是 id_Fornecedor
如果我在所有引用上始终使用相同的列名“numero_cliente”,则不会出现问题。但我担心我无法保证Client类的所有列名在所有表上都是相同的。
有人知道该怎么办吗?流利的NHibernate团队可以看到这个并在此发表评论吗?
如果你想在这里确切的SQL是:
无法初始化集合:
[Sistema.Clientes.Cliente.Acionamentos#019012938/07] [SQL:SELECT acionament0_.id_Fornecedor as id7_1_,acionament0_.id_Acionamento as id1_1_,acionament0_.id_Acionamento as id1_6_0_,acionament0_.DataHora as DataHora6_0_,acionament0_.Tipo as Tipo6_0_, acionament0_.Descricao as Descricao6_0_,acionament0_.numero_cliente as numero5_6_0_,acionament0_.id_Usuario as id6_6_0_ FROM clientes.acionamento acionament0_ WHERE acionament0_.id_Fornecedor =?
当试图获得Cliente.Acionamentos
时,上面的错误会被抛出以下是HBM XML:
Sistema.Clientes.Cliente.hbm.xml:
<id name="numero_cliente" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="numero_cliente" />
<generator class="assigned" />
</id>
<bag cascade="all" lazy="true" name="Acionamentos" mutable="true">
<key>
<column name="id_Fornecedor" /><!-- oopps, this should be numero_cliente -->
</key>
<one-to-many class="Sistema.CRM.Acionamento, Sistema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
Sistema.CRM.Acionamento.hbm.xml:
<many-to-one class="Sistema.Clientes.Cliente, Sistema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Cliente">
<column name="numero_cliente" />
</many-to-one>
Estoque.Movimentacao.hbm.xml:
<many-to-one class="Sistema.Clientes.Cliente, Sistema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Cliente" not-found="ignore">
<column name="id_Fornecedor" />
</many-to-one>
答案 0 :(得分:1)
通过您提供的帮助步骤,有些人祈祷我解决了它,添加了KeyColumn!
Id(v => v.numero_cliente, "numero_cliente")
HasMany(v => v.Acionamentos).KeyColumn("numero_cliente").Cascade.All().LazyLoad()
添加之后,生成的HBM更改为:
<bag cascade="all" lazy="true" name="Acionamentos" mutable="true">
<key>
<column name="numero_cliente" />
</key>
<one-to-many class="Sistema.CRM.Acionamento, Sistema, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
并且不再发生SQL错误。
我很高兴我现在可以使用它!我真的不想使用EF