NHibernate One-To-Many повторно получить проблему объекта - PullRequest
0 голосов
/ 29 ноября 2010

Я столкнулся со странной проблемой, касающейся составных ключей и отношений один ко многим.

У меня есть следующий класс Invoice:

public class Invoice: AccountingBase<InvoiceItem>
{
    public virtual IList<InvoiceItem> InvoiceItems {.....}
}

наследуемый класс (AccountingBase) выглядит следующим образом:

public abstract class AccountingBase<TItemType>  : AccountingBase where TItemType : AccountingItemBase
{
    public virtual ObservableCollection<TItemType> Items { get; set; }

    public abstract void AddItem(TItemType item);
}

И нижний класс:

public abstract class AccountingBase
{
    public virtual Subsidiary Subsidiary {....}
    public virtual int ID{ ....}
}

Класс сопоставления для счета-фактуры выглядит следующим образом:

 <class name="Invoice" table="Invoice">
     <composite-id>
       <key-many-to-one class="Subsidiary" name="Subsidiary"/>
       <key-property name="ID" column="InvoiceID" />
     </composite-id>
     <bag name="InvoiceItems" table="InvoiceItem" inverse="true" lazy="false">
       <key>
         <column name="Subsidiary" />
         <column name="InvoiceID" />
       </key>
       <one-to-many class="InvoiceItem" />
     </bag>   
 </class>

Теперь, когда я получаю список счетов, он работает нормально, включая ленивую загрузку каждого объекта Items. Проблема, которую я получаю, когда я выбираю счет для редактирования. Я открываю новый сеанс и пытаюсь получить тот же счет-фактуру, используя новый сеанс, но когда он загружает счет-фактуру, он не загружает элементы, он извлекает их как пустые, хотя, когда я запускаю сгенерированный SQL-файл вручную, он прекрасно работает. В чем может быть причина?

Код, который я запускаю, чтобы получить новый объект Invoice в новом сеансе, используя старый объект:

Invoice = Session.Get<Invoice>(invoice);

Когда я отлаживаю, счет-фактура имеет тип счета-фактуры, а также счет-фактура имеет 1 InvoiceItem в коллекции InvoiceItems, но новый экземпляр в Invoice, все поля заполнены, но InvoiceItems является нулевым. Что я должен знать о Nhibernate, что может вызвать такого рода ошибки?

Я пытался lazy="false".

1 Ответ

0 голосов
/ 30 ноября 2010

Нашел исправление, мне нужно было правильно реализовать методы Equality как в классе Invoice, так и в дополнительном классе.

...