Навигаторы NHibernate сопоставлены с частью проблемы составного ключа - использование устаревшей базы данных

У нас есть устаревшая база данных, которую мы не можем изменить. И мы пытаемся перейти на NHibernate вместо старого слоя DataAccess, который является мусором и является слишком медленным.

у него есть такие таблицы:

Таблица GPI имеет столбцы (PU_ID, PAR_ID, Data, Data2)

У нас есть устаревшая база данных, которую мы не можем изменить. И мы пытаемся перейти на NHibernate вместо старого слоя DataAccess, который является мусором и является слишком медленным.

у него есть такие таблицы:

Таблица GPI имеет столбцы (PU_ID, PAR_ID, Data, Data2)

У нас есть устаревшая база данных, которую мы не можем изменить. И мы пытаемся перейти на NHibernate вместо старого слоя DataAccess, который является мусором и является слишком медленным.

у него есть такие таблицы:

Таблица GPI имеет столбцы (PU_ID, PAR_ID, Data, Data2)
Таблица BLOCK имеет столбцы (GA_ID, Data, PAR_ID)
Таблица COMPANY содержит столбцы (PU_ID, Data)

. Я создал эти отображения для таблиц выше:

GPI

<class name="GroupPartnerInterest" table="[GPI]">
    <composite-id >
        <key-property name="GroupId" column="PAR_ID" />
        <key-property name="CompanyId" column="PU_ID" />
    </composite-id>
    <property name="data" column="Data"/>
    <property name="data2" column="Data2"/>
    <many-to-one name="Company" fetch="select" cascade="none">
        <column name="PU_ID"/>
    </many-to-one>
    <set name="Blocks" cascade="none" inverse="true" fetch="select">
        <key property-ref="GroupId">
            <column name="PAR_ID"/>
        </key>
        <one-to-many class="Block"/>
    </set>
</class>

BLOCK

<class name="Block" table="[BLOCK]" >
    <id name="BlockId" column="GA_ID" >
        <generator class="assigned"/>
    </id>
    <property name="data" column="Data"/>
    <property name="GroupId" column="PAR_ID"/>
    <set name="GroupPartnerInterests" cascade="all-delete-orphan" fetch="select">
        <key property-ref="GroupId">
            <column name="PAR_ID"/>
        </key>
        <one-to-many class="GroupPartnerInterest"/>
    </set>
</class>

COMPANY

<class name="Company" table="[COMPANY]">
    <id name="CompanyId" column="PU_ID">
        <generator class="assigned"/>
    </id>
    <property name="data" column="Data"/>
    <set name="GroupPartnerInterests" cascade="none" inverse="true" fetch="select">
        <key>
            <column name="PU_ID"/>
        </key>
        <one-to-many class="GroupPartnerInterest"/>
    </set>
</class>

Классы очень простые и простые. Все реализуют методы Equals и GetHashCode.

Вот список навигаторов, которые работают:

  • GroupPartnerInterest.Company - отлично работает
  • Company.GroupPartnerInterests - отлично работает
  • GroupPartnerInterest.Company - отлично работает

И эти два сбоя:

  • Block.GroupPartnerInterests:

У меня есть модульный тест:

[TestMethod]
public void TestGroupPartnerInterests()
{
    using ( ISession session = SessionFactory.OpenSession() )
    {
        IList<Block> blocks = session.CreateCriteria( typeof( Block ) )
            .SetMaxResults( 5 ).List<Block>();

        foreach ( var block in blocks )
        {
            TestContext.WriteLine( "Block #{0}", block.BlockId );

            if ( block.GroupPartnerInterests != null )
            {
                foreach ( GroupPartnerInterest gpi in block.GroupPartnerInterests )
                {
                    TestContext.WriteLine( "Company '{0}':", gpi.Company.CompanyId );
                }
            }
        }
    }
}

Если я закомментирую, блокирует навигационное отображение блоков в тесте отображения GPI и выводит некоторые данные:

Блок № 1
Компания «ЛАЛА»:
Компания 'LALA SA':
Блок № 2
Компания 'BG PO':
Компания «ЛИМПОПО»:
Блок № 3
Компания «ХАХА»:
Компания «Другие партнеры»:
Блок № 4

Но тест завершается неудачно со следующей ошибкой:

NHibernate.LazyInitializationException: Initializing [Model.EntityClasses.Block # 999] - не удалось лениво инициализировать коллекцию ролей: Model.EntityClasses.Block.GroupPartnerInterests, ни один сеанс или сеанс не был закрыт.

'999' - это существующий PAR_ID - данные согласованы: есть два блока с этим PAR_ID и несколько записей в GPI.

Почему он закрывает сеанс в какой-то момент?

  • GroupPartnerInterest.Blocks:

Модульный тест почти такой же, как я упоминал выше, только разные свойства используются. Ниже приведена ошибка:

NHibernate.MappingException: NHibernate.MappingException: свойство не найдено: GroupId для объекта Model.EntityClasses.GroupPartnerInterest.

Если я удаляю «property-ref = GroupId» из элемента навигатора Blocks в При отображении GPI я получу следующее исключение:

NHibernate.FKUnmatchingColumnsException: NHibernate.FKUnmatchingColumnsException: Внешний ключ (FKA3966498349694F: [BLOCK] [PAR_ID])) должен иметь такое же количество столбцов, что и первичный ключ, на который есть ссылка ([GPI] [ PAR_ID, PU_ID]).

Есть ли способ сопоставить блоки с GPI, чтобы работал навигатор GroupPartnerInterest.Blocks?

Спасибо, Алекс

6
задан LucID 21 August 2010 в 09:27
поделиться