Ассоциация NHibernate «многие к одному» отказывается загружаться

У меня есть следующее сопоставление: свойство «сообщение» «многие к одному» имеет соответствующую ассоциацию «один ко многим» в классе «RootMessage».

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

Любые идеи?


person rjarmstrong    schedule 30.10.2009    source источник


Ответы (1)


Итак, после почти дня огорчения у меня есть решение. NHibernate не предполагает автоматически двунаправленную ассоциацию между двумя объектами, даже если у вас есть сопоставления между ними. Вам необходимо обязательно объявить ассоциации в вашем коде перед сохранением. Таким образом:

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

Также необходимо применить inverse="true" к стороне с членом коллекции:

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