代码之家  ›  专栏  ›  技术社区  ›  Michal Ciechan

NHibernate一对多重新检索对象问题

  •  0
  • Michal Ciechan  · 技术社区  · 14 年前

    我遇到了一个关于组合键和一对多关系的奇怪问题。

    我有以下发票类别:

    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" .

    1 回复  |  直到 14 年前
        1
  •  0
  •   Michal Ciechan    14 年前

    找到修复方法后,我必须在Invoice类和Subsidiary类中正确地实现相等方法。