2009-10-30 55 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>