Fluent NHibernate 1.1:在不同的类上使用多个列名映射时

时间:2011-02-14 23:31:14

标签: fluent-nhibernate

假设我有这个(简化)

班级客户
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>

1 个答案:

答案 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