2009-10-30 72 views
0

我有以下映射,多对一的属性'Message'在'RootMessage'类中具有相应的一对多关联。NHibernate多对一关联拒绝加载

<class name="IMessageReceipt" lazy="false" table="MessageReceipts" abstract="true"> 

     <id name="Id"> 
      <generator class="guid.comb"></generator> 
     </id> 

     <discriminator column="Discriminator"/> 
     <property name="Address" /> 
     <property name="Status" /> 
     <property name="MarkedAsDeleted" /> 

     <many-to-one name="Message" column="MessageId" class="RootMessage" 
       not-found="ignore"/> 

     <subclass name="MessageReceipt" lazy="false" discriminator-value="1"> 
     </subclass> 

    </class> 

许多-to-one关联拒绝当使用标准的API(我得到的是NULL),这里是一个查询的例子来加载:

  List<IMessageReceipt> list; 
     using (var tx = Session.BeginTransaction()) 
     { 
      var criteria = Session.CreateCriteria(typeof (IMessageReceipt)); 
      criteria.Add(Restrictions.Eq("Address", address)); 
      criteria.Add(Restrictions.Eq("Status", status)); 
      criteria.SetFirstResult(0); 
      criteria.SetMaxResults(quantity); 
      list = criteria.List<IMessageReceipt>().ToList(); 
      tx.Commit(); 
     } 
     return list; 

任何想法?

回答

1

好吧,经过近一天的懊恼我有解决方案。即使你有两个之间的映射,NHibernate也不会自动承担两个实体之间的双向关联。在持续之前,您需要在代码中强制性地声明关联。因此:

message.Receipts = receipts; 
foreach (var receipt in receipts) 
{ 
    receipt.Message = message; 
} 
Session.Save(message); 
tx.Commit(); 

另外逆= “真” 应适用于与收集构件侧:

<set name="Receipts" inverse="true" cascade="save-update"> 
<key column="MessageId"></key> 
<one-to-many class="IMessageReceipt"/> 
</set>