2010-10-25 10 views
6

Uso Nhibernate con fluidez. Este código carga una instancia de tipo T de la base de datos en función de su ID.Nhibernate GetById devuelve ObjectNotFoundException inserta of null

public T GetById(IdT id, bool shouldLock) 
    { 
     T entity; 

     if (shouldLock) 
     { 
      entity = (T) NHibernateSession.Load(persitentType, id, LockMode.Upgrade); 
     } 
     else 
     { 
      entity = (T) NHibernateSession.Load(persitentType, id); 
     } 

     return entity; 
    } 

Pero tengo un gran problema. Cuando llamo a la propiedad, obtengo ObjectNotFoundException en lugar de null.

¿Cómo puedo hacer que esa entidad sea nulable y no devuelva la excepción?

Respuesta

12

Usaría Get en lugar de Load. Get devolverá null, en lugar de una excepción.

+0

-1. El tipo de entidad es anulable, lo más probable es que sea un tipo de referencia. – Aliostad

+1

En cualquier caso, la solución al problema es utilizar Get, en lugar de tratar de carga perezosa ... –

+2

1 esta es la respuesta correcta sólo le hace falta la explicación que di con la mía. –

9

Creo que te equivocas en lo que hace Load. Esto crea un objeto proxy NHibernate para usted por ID sin consultar realmente la base de datos.

Al invocar una propiedad, consultará la base de datos. Si proporcionó una identificación incorrecta, no existe un objeto subyacente, por lo tanto, la excepción.

Las situaciones normales para las que usará esto es para decir que tiene un objeto de estado y el usuario seleccionó PA en un menú desplegable. En lugar de tener que consultar la base de datos para el objeto de estado ya que usted tiene la clave PA, puede llamar al Load y luego pasar ese objeto de estado a un objeto diferente para tener la relación correcta entre el objeto X y el estado PA.

El método que desea utilizar para ser objeto get general o conseguir nula si la clave no existe es sólo Session.Get<T>(object ID)

4

Load no volverá nula. Siempre devolverá una entidad o lanzará una excepción. Si desea ese comportamiento, use Get. Más información sobre este Difference between Get and Load

Cuestiones relacionadas