我遇到了一个关于组合键和一对多关系的奇怪问题。
我有以下发票类别:
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 = Session.Get<Invoice>(invoice);
调试时,invoice类型为invoice,而且invoice在InvoiceItems集合中有1个InvoiceItem,但是invoice中的新实例填充了所有字段,但InvoiceItems为空。关于Nhibernate有什么我应该知道的可能导致这种错误吗?
我试过了
lazy="false"
.