У нас есть устаревшая база данных, которую мы не можем изменить. И мы пытаемся перейти на 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.
Вот список навигаторов, которые работают:
И эти два сбоя:
У меня есть модульный тест:
[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.
Почему он закрывает сеанс в какой-то момент?
Модульный тест почти такой же, как я упоминал выше, только разные свойства используются. Ниже приведена ошибка:
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?
Спасибо, Алекс