persister for code c# .net nhibernate

code - no persister for fluent nhibernate c#



NHibernate.MappingException: No persister para: XYZ (15)

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<T>(Id);

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

<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true"> <id name="ID" column="ID" unsaved-value="0"> <generator class="identity" /> </id> <property name="Name" column="Name" /> <property name="NumberOfBuckets" column="NumberOfBuckets" /> <property name="SearchCriteriaOne" column="SearchCriteriaOne" /> <bag name="_Businesses" cascade="all"> <key column="SubCategoryId"/> <one-to-many class="HQData.Objects.Business, HQData"/> </bag> <bag name="_Buckets" cascade="all"> <key column="SubCategoryId"/> <one-to-many class="HQData.Objects.Bucket, HQData"/> </bag> </class> </hibernate-mapping>

¿Alguien ha corrido este problema antes?

Aquí está el mensaje de error completo:

MappingException: No persister for: HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Event/Default/DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Impl/SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Impl/SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Impl/SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id) in c:/CSharp/NH2.0.0/nhibernate/src/NHibernate/Impl/SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id) in C:/Development/HQChannelRepo/HQ Channel Application/HQChannel/HQData/DataAccessUtils/NHibernateObjectHelper.cs:42 HQWebsite.LocalSearch.get_subCategory() in C:/Development/HQChannelRepo/HQ Channel Application/HQChannel/HQWebsite/LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e) in C:/Development/HQChannelRepo/HQ Channel Application/HQChannel/HQWebsite/LocalSearch.aspx.cs:27 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object 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.


¿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?


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 compilació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.


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


Conseguí esto de here :

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

public class UserMap : ClassMap<user> // note the public!

Acabo de tener:

class UserMap : ClassMap<user>


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<YourEntityClassName>())


Gastando aproximadamente 4 horas en googlear y ing , 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


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


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

p.ej

donde MyApp.Data es ensamblado que contiene tus mapeos


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 ... :)


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

Si está utilizando app.config ...

. . <property name="show_sql">true</property> <property name="query.substitutions">true 1, false 0, yes ''Y'', no ''N''</property> <mapping assembly="Project.DomainModel"/> <!-- Here --> </session-factory> . .


Si ejecuta pruebas en el repositorio 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 repositorio (es decir, tenemos un enlace simbólico de cada ensamblaje de prueba a un solo Hibernate.xfg.xml)


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!


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


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)


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.