【问题标题】:Fluent NHibernate 1.1: when multiple column name mappings are used on different classesFluent NHibernate 1.1:当在不同的类上使用多个列名映射时
【发布时间】:2011-06-27 06:42:47
【问题描述】:

假设我有这个(简化)

类客户
Id(v => v.numero_cliente, "numero_cliente")
HasMany(v => v.Acionamentos).Cascade.All().LazyLoad()

类运动
参考文献(v => v.Cliente, "id_Fornecedor")

类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 类的所有列名在所有表上都相同。

有人知道该怎么做吗? Fluent NHibernate 团队可以看到这一点并在此处发表评论吗?

如果你想要这里的确切 SQL:
无法初始化集合: [Sistema.Clientes.Cliente.Acionamentos#019012938/07][SQL:选择 acionament0_.id_Fornecedor 作为 id7_1_,acionament0_.id_Acionamento 作为 id1_1_,acionament0_.id_Acionamento 作为 id1_6_0_,acionament0_.DataHora 作为 DataHora6_0_,_0_作为 Tipo6。 acionament0_.Descricao 为 Descricao6_0_,acionament0_.numero_cliente 为 numero5_6_0_,acionament0_.id_Usuario 为 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>

【问题讨论】:

  • 错了怎么办?这不是 Fluent NHibernate 的错误跟踪站点。如果您在生成错误的 SQL 时遇到问题,请发布正在生成的 SQL 以及您希望它是什么,以便用户可以帮助您解决问题。
  • 您将不得不添加更多细节。这里真的没有什么可继续的。 “错误的 SQL”可能意味着任何事情。
  • 也许我们宝贵的朋友@James-Gregory 或@paul-batum 可以说明这一点。
  • Fornecedor 和 DataHora - 我几乎不敢通过谷歌翻译运行它们...
  • 你能从你生成的 xml 映射文件中粘贴代码吗?这应该有助于找到你的问题。 blog.yodersolutions.com/2009/07/…

标签: fluent-nhibernate


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-02-17
    • 2014-12-09
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多