NHibernate.MappingException: No persister para: XYZ

Ahora, antes de decirlo: hice Google y mi archivo hbm.xml es un recurso incrustado.

Aquí está el código que estoy llamando:

 ISession session = GetCurrentSession(); var returnObject = session.Get(Id); 

Aquí está mi archivo de mapeo para la clase:

                    

¿Alguien ha corrido este problema antes?

Aquí está el mensaje de error completo:

  MappingException: No persister para: HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName, Boolean throwIfNotFound)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad (evento LoadEvent, LoadType loadType)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (evento LoadEvent, LoadType loadType)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (String entityName, Object id)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1029 NHibernate.Impl.SessionImpl.Get (Type entityClass, Object id)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (Object id)
  en c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Int32 Id)
  en C: \ Desarrollo \ HQChannelRepo \ HQ Aplicación de canal \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory ()
  en C: \ Desarrollo \ HQChannelRepo \ HQ Aplicación de canal \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (Object remitente, EventArgs e)
  en C: \ Desarrollo \ HQChannelRepo \ HQ Aplicación de canal \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 27 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Objeto o, Objeto t, EventArgs e) +15 System.Web .Util.CalliEventHandlerDelegateProxy.Callback (Object Sender, EventArgs e) +33 System.Web.UI.Control.OnLoad (EventArgs e) +99 System.Web.UI.Control.LoadRecursive () +47 System.Web.UI.Page .ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436 

Actualización , esta es la solución para mi escenario: había cambiado un código y no estaba agregando el ensamblado al archivo de configuración durante el tiempo de ejecución.

Parece que olvidó agregar un ensamblaje de mapeo a la configuración de fábrica de la sesión.

Si está utilizando app.config …

 . . true true 1, false 0, yes 'Y', no 'N'    . . 

Algo obvio, pero bastante útil para alguien nuevo en NHibernate.

Todos los archivos XML Mapping deben tratarse como recursos incrustados en lugar de como contenido predeterminado. Esta opción se establece editando el atributo de Acción de comstackción en las propiedades del archivo.

Los archivos XML se incrustan en el ensamblado y se analizan durante el inicio del proyecto durante la fase de configuración de NHibernate.

Mi problema era que olvidé poner .hbm en el nombre del mapping xml. ¡Asegúrate también de convertirlo en un recurso incrustado!

Conseguí esto de aquí :

En mi caso, la clase de mapeo no era pública. En otras palabras, en lugar de:

 public class UserMap : ClassMap // note the public! 

Acabo de tener:

 class UserMap : ClassMap 

Gastando aproximadamente 4 horas en googlear y stackoverflowing , probando todas las cosas por ahí, he encontrado mi error:

Mi archivo de asignación se llamaba .nbm.xml, excepto .hbm.xml . Eso fue una locura

Tuve un problema similar, y lo resolví como sigue:

Estoy trabajando en MS SQL 2008, pero en la configuración NH tenía mal dialecto: NHibernate.Dialect. MsSql2005Dialeccione si lo corrijo a: NHibernate.Dialect. MsSql2008Dialect entonces todo está funcionando bien sin una excepción “No persister para: …” David.

También estaba agregando el ensamblaje incorrecto durante la inicialización. La clase que estoy persistiendo está en el ensamblado n. ° 1 y mi archivo .hbm.xml está incrustado en el ensamblaje n. ° 2. Cambié cfg.AddAssembly(... para agregar el ensamblado # 2 (en lugar del ensamblado n. ° 1) y todo funcionó. ¡Gracias!

Para agregar a la respuesta de Amol, no cometa el error de especificar el tipo de clase de interfaz. Asegúrese de especificar la clase de implementación . (Es decir, no use IDomainObjectType). No es que haya cometido este error … 🙂

¿Debería ser name="Id" ? Typos son una causa probable.

Lo siguiente sería probarlo con una prueba no genérica para asegurarse de que está pasando el parámetro de tipo correcto.

¿Puedes publicar el mensaje de error completo?

Tuve el mismo problema porque estaba agregando el ensamblado incorrecto en el método Configuration.AddAssembly ().

Si ejecuta pruebas en el repository desde un ensamblaje separado, asegúrese de que su Hibernate.cfg.xml esté configurado para salir siempre en el directorio bin de dicho ensamblado. Esto no nos estaba sucediendo y obtuvimos el error anterior en ciertas circunstancias.

Descargo de responsabilidad: Este podría ser un consejo un poco esotérico, dado que es un resultado directo de cómo estructuramos nuestros ensambles de prueba de integración de repository (es decir, tenemos un enlace simbólico de cada ensamblaje de prueba a un solo Hibernate.xfg.xml)

No olvides especificar la información de mapeo en el archivo .config

p.ej

donde MyApp.Data es ensamblado que contiene tus mapeos

Este error se produce debido a una configuración de asignación no válida. Debería verificar dónde establece. Asignaciones para su fábrica de sesiones. Básicamente busca “.Mappings (” en tu proyecto y asegúrate de haber especificado la clase de entidad correcta en la línea siguiente.

 .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) 

Tuve un problema similar cuando encontré un objeto por id … Todo lo que hice fue usar el nombre completo en el nombre de la clase. Eso es antes de que fuera:

 find("Class",id) 

Objeto por lo que se convirtió así:

 find("assemblyName.Class",id) 

Asegúrese de haber llamado al CreateCriteria(typeof(DomainObjectType)) en Session para el objeto de dominio que CreateCriteria(typeof(DomainObjectType)) obtener de DB.