Pregunta

Tengo la siguiente asignación, la propiedad muchos a uno 'Mensaje' tiene una asociación uno a muchos correspondiente en la clase 'Mensaje raíz'.

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

La asociación muchos a uno se niega a cargar cuando se usa la API de criterios (todo lo que obtengo es NULL), aquí hay un ejemplo de una consulta:

            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;

¿Alguna idea?

¿Fue útil?

Solución

Ok, así que después de casi un día de disgusto tengo la solución. NHibernate no asume automáticamente una asociación bidireccional entre dos entidades incluso si tiene asignaciones entre ambas . Debe declarar imperativamente las asociaciones en su código antes de continuar. Por lo tanto:

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

También inverso = " verdadero " debe aplicarse al lado del miembro de la colección:

<set name="Receipts" inverse="true" cascade="save-update">
<key column="MessageId"></key>
<one-to-many class="IMessageReceipt"/>
</set>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top