2009-10-30 2 views
0

У меня есть следующее сопоставление: свойство «сообщение» много-к-одному имеет соответствующую ассоциацию «один-ко-многим» в классе «RootMessage».Сообщество NHibernate many-to-one отказывается загружать

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

Многочастичная к одному ассоциации отказывается загружаться при использовании критериев 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>