nhibernate - referencia - La carga diferida no funciona para la relación de muchos a uno al mapear a un campo que no es clave utilizando la propiedad-ref
no se encuentra un proveedor de base de datos de entity framework compatible (1)
El problema está causado por el atributo de property-ref
. La carga diferida solo funciona cuando la referencia de many-to-one
usa la clave primaria del otro objeto, ya que NHibernate supone que hay una restricción de clave externa que impone la validez de dicho valor. Con una clave no primaria (indicada por la propiedad-ref), NHibernate no hace esta suposición y, por lo tanto, no asume que el objeto relacionado debe existir. Dado que no desea crear un proxy para un objeto que no existe (es decir, debe ser nulo en lugar de un proxy), busca el objeto remoto con impaciencia. Este mismo problema existe cuando not-found="ignore"
se especifica porque esto indica que la relación de la clave externa no se aplica y puede dar como resultado una referencia nula.
Ver también:
Tengo una base de datos heredada que estoy mapeando usando NHibernate. Los objetos de interés son una cuenta y una lista de objetos de notificación. Los objetos se ven así:
public class Notification
{
public virtual int Id { get; set; }
public virtual DateTime BatchDate { get; set; }
/* other properties */
public virtual Account Account { get; set; }
}
public class Account
{
public virtual int Id { get; set; }
public virtual string AccountNumber { get; set; }
/* other properties */
}
Los archivos de mapeo se ven así:
<class name="Account" table="Account" dynamic-update="true">
<id name="Id" column="AccountID">
<generator class="native" />
</id>
<property name="AccountNumber" length="15" not-null="true" />
<!-- other properties -->
</class>
<class name="Notification" table="Notification">
<id name="Id" column="Id">
<generator class="native" />
</id>
<!-- other properties -->
<many-to-one name="Account" class="Account" property-ref="AccountNumber" lazy="proxy">
<column name="AcctNum" />
</many-to-one>
Sin embargo, cuando creo un criterio como
return session.CreateCriteria(typeof(Notification)).List<Notification>();
Recibo un caso de Select N + 1 en el que se carga cada cuenta, aunque nunca se hace referencia a la misma. ¿Por qué se cargan todas las cuentas cuando el mapeo múltiple se mapea como un proxy flojo?