2009-03-02 11 views
17

Tengo una base de datos heredada que estoy mapeando utilizando NHibernate. Los objetos de interés son una cuenta y una lista de objetos de notificación. Los objetos se ven como:La carga diferida no funciona para la relación muchos a uno cuando se asigna a un campo que no es clave mediante la propiedad-ref

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 */ 
} 

archivos El mapeo aspecto:

<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 se crea un criterio como

return session.CreateCriteria(typeof(Notification)).List<Notification>(); 

que estoy recibiendo un caso Seleccione N + 1 donde cada cuenta se carga aunque la Cuenta nunca se haga referencia. ¿Por qué se cargan todas las cuentas cuando el mapeo múltiple se mapea como un proxy flojo?

+0

me sale el mismo problema, yo no recuerdo haber visto un post somehwere diciendo muchos-a-uno propiedad ref de que no puede ser cargado ligeramente , Simplemente no puedo encontrar la fuente. Esto fue con NH 1.2 – Jafin

Respuesta

13

El problema está causado por el atributo property-ref. La carga lenta solo funciona cuando la referencia many-to-one utiliza 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 con impaciencia el objeto remoto. Este mismo problema existe cuando se especifica not-found="ignore", ya que esto indica que la relación de clave externa no se aplica y puede dar como resultado una referencia nula.

Consulte también:

+0

El problema en NH parece estar en TwoPhaseLoad.cs: inspecciona LoadedState y llama a IType.ResolveIdentifier para traducir KEYs en Entidades o Proxies. El IType involucrado aquí es ManyToOne (PK = falso, Uniq = verdadero, eager = falso). Termina llamando a ResolveIdentifier (valor, sesión, propietario) desde EntityType.cs base, y ese comprueba IsReferenceToPrimaryKey (= falso) y llama a LoadByUniqueKey(). Este a su vez tiene un comentario interesante "TODO: implementar el caché? Proxies" (HURRA). Luego, combo de session.PersistenceContext.GetEntity (new EntityUniqueKey (tecla ...)) + persister.LoadByUniqueKey (tecla ...) capta la entidad. – quetzalcoatl

Cuestiones relacionadas