2009-03-06 13 views
18

Estoy usando NHibernate para extraer algunos datos de una base de datos heredada, y he encontrado varios casos donde hay una clave externa, pero la fila a la que se hace referencia ha sido eliminada.¿Es posible evitar NHibernate.ObjectNotFoundException cuando hay una clave externa pero la fila a la que se hace referencia no existe?

Cuando hago mi mapeo de NHibernate (usando Fluido NHibernate así:

References(d => d.Group) 
    .WithColumns("groupId", "dataset") 
    .SetAttribute("lazy", "true"); 

me sale un proxy no inicializado para Group al cargar el objeto raíz, seguido de un ObjectNotFoundException cuando intento usarlo

.

Si desactivo la carga diferida, consigo un ObjectNotFoundException inmediatamente al cargar la raíz

Por lo tanto:. ¿hay una manera de tener NHibernate hacer la nula Group cuando carga la raíz? ¿O es posible verificar el proxy unificado de alguna manera, para ver si logrará cargar la fila?

Respuesta

15

he encontrado la solución here - i tenía que añadir

.SetAttribute("not-found", "ignore"); 

a la asignación.

+6

Gracias por esta respuesta. Estaba teniendo el mismo problema. Gracias también por tener un ID de usuario con el nombre de una pista Aphex Twin. Por cierto, en mi versión de FluentNH es .NotFound.Ignore(). – David

+0

gracias por darse cuenta del nombre de usuario;) – mookid8000

2
+0

Parece prometedor, pero me da cuenta de que tengo acceso solo al nombre de la entidad que falta y, muy raro, ¿qué parece ser una instancia aleatoria de la entidad que falta? ¿Sabes cómo usar esta interfaz? – mookid8000

+0

No lo he probado, pero debe obtener el nombre y la identificación de la entidad, consulte http://fisheye3.atlassian.com/browse/nhibernate/trunk/nhibernate/src/NHibernate/Proxy/IEntityNotFoundDelegate.cs?r=3007 –

+0

Esta es la implementación predeterminada, la que arroja ObjectNotFoundException: http://fisheye3.atlassian.com/browse/nhibernate/trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs?r=4091#l76 –

2

¿ha verificado que su propiedad referenciada todavía se está cargando perezosamente? Para que NHibernate cargue referencias de forma perezosa, debe asegurarse de que la referencia NO ES NULA. Cuando establece not-found = "ignore", indirectamente le dice a NHibernate que existe la posibilidad de que la referencia no exista, impidiendo que la restricción NOT NULL sea válida. En el caso que describió anteriormente, no encontrará un error, pero puede observar una llamada ansiosa a la base de datos para cargar su Grupo.

0

En la aplicación que estoy trabajando en el establecimiento de

lazy="proxy" 

resuelto el problema.

Cuestiones relacionadas