Свободный NHibernate 1.1: когда несколько сопоставлений имен столбцов используются в разных классах - PullRequest
1 голос
/ 15 февраля 2011

Предположим, у меня есть это (упрощенно)

Класс Cliente
Идентификатор (v => v.numero_cliente, "цифра_cliente")
HasMany (v => v.Acionamentos) .Cascade.All() .LazyLoad ()

Класс Movimentacao
Ссылки (v => v.Cliente, "id_Fornecedor")

Класс Acionamento
Ссылки (v => v.Cliente,"figurero_cliente")

Свободное владение nHibernate сгенерирует неправильный SQL, например:
Если я попытаюсь получить Acionamentos, то он выдаст неправильный SQL:

SELECT * FROMAcionamentos WHERE id_Fornecedor = p0

Но в моем отображении Acionamento я установил ссылку на столбец с именем цифра_клиенты , а не на id_Fornecedor

Если я использую всегда одно и то же имя столбца "Numberro_Cliente" во всех ссылках, никаких проблем не возникает.Но я боюсь, что не смогу гарантировать, что все имена столбцов для класса Client будут одинаковыми во всех таблицах.

Кто-нибудь знает, что делать?Может ли команда Fluent NHibernate увидеть это и опубликовать комментарий здесь?

Если вы хотите, чтобы точный SQL был здесь:
не удалось инициализировать коллекцию: [Sistema.Clientes.Cliente.Acionamentos # 019012938/ 07] [SQL: SELECT acionament0_.id_Fornecedor, как id7_1_, acionament0_.id_Acionamento, как id1_1_, acionament0_.id_Acionamento, как id1_6_0_, acionament0_.DataHora как DataHora6_0_, acionament0_.Tipo как Tipo6_0_, acionament0_.Descricao как Descricao6_0_, acionament0_.numero_cliente как numero5_6_0_, acionament0_.id_Usuario as id6_6_0_ FROM clientes.acionamento acionament0_ WHERE acionament0_.id_Fornecedor =?

При попытке получить Cliente.Acionamentos


H ниже указывается ошибка.:

Система.Клиенты.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>

Система.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 Ответ

1 голос
/ 17 февраля 2011

С помощью предоставленных вами шагов и некоторой молитвы я решил ее, добавив 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...