Tengo un problema extraño en mi proyecto actual. La carga diferida para consultas no funciona. Cuando consulto una lista, nhibernate recupera todas las asociaciones por separado.NHibernate crea proxy a través de session.Load(), pero no a través de API de Criterios o de Linq
Extraje partes pequeñas de él y lo puse en una solución separada. Básicamente, lo que tengo ahora es un Account-Table y un AccountSync-Table. Ambos tienen una ID y una URL, mientras que la ID es solo un db-guid.
Mis clases son:
public class HippoAccount
{
public virtual Guid Id { get; set; }
public virtual string Url { get; set; }
public virtual HippoAccountSync Sync { get; set; }
}
public class HippoAccountSync
{
public virtual Guid Id { get; set; }
public virtual string Url { get; set; }
public virtual HippoAccount Account { get; set; }
}
Cuando ahora me carga un objeto a través de su GUID:
var account = session.Load<HippoAccount>(accountId);
Console.WriteLine(NHibernateUtil.IsPropertyInitialized(account, "Sync"))
... vuelve false
y la propia cuenta es un proxy.
Pero cuando se carga una lista a través de la API de criterios:
var account = (HippoAccount)session
.CreateCriteria(typeof (HippoAccount))
.Add(Restrictions.Eq("Id", accountId))
.List()[0];
... la propiedad Sync
consigue inicializado (disparar una segunda consulta de selección), y el objeto devuelto no es un proxy.
¿Es ese comportamiento predeterminado? ¿Qué me estoy equivocando?
El mapeo es:
<class name="HippoAccount" table="AllAccounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url" />
<many-to-one
class="HippoAccountSync"
name="Sync"
not-found="ignore"
property-ref="Url">
<column name="url" />
</many-to-one>
</class>
<class name="HippoAccountSync"
mutable="false"
table="Accounts">
<id name="Id" type="guid">
<generator class="guid"/>
</id>
<property name="Url">
<column name="serviceUri" />
</property>
<many-to-one class="HippoAccount"
name="Account"
property-ref="Url"
not-found="ignore">
<column name="serviceUri" />
</many-to-one>
</class>
no está seguro de si es del todo relacionados, pero hay problemas con not-found = "ignorar": http://nhjira.koah.net/browse/NH-1001 http: //guildsocial.web703 .discountasp.net/dasblogce/CommentView, guid, ba00b19d-bd60-442b-b2e7-935277a9f1eb.aspx –
Tienes razón. Otro problema es la propiedad-ref: también deshabilita la carga diferida. http://maonet.wordpress.com/2007/12/05/lazy-load-conflicts-with-property-ref-in-many-to-one-mapping/ –