NHibernate.MappingException: No persister para: XYZ


Ahora, antes de decirlo: Yo hice Google y mi hbm.xml archivo 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 asignación 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 a este tema 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

Actualizar , esta es la solución para mi escenario : Había cambiado algún código y no estaba agregando el Ensamblado al archivo de configuración durante ejecución.

Author: Jeroen, 2008-09-12

15 answers

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

Si estás usando la aplicación.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>
.
.
 93
Author: Andy S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-12 00:20:28

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

Todos los archivos de asignación XML deben tratarse como Recursos incrustados en lugar del contenido predeterminado . Esta opción se establece editando el atributo Build Action en las propiedades del archivo.

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

 80
Author: Chris Vosnidis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-25 10:09:45

Mi problema fue que me olvidé de poner el.hbm en el nombre del xml de asignación. También asegúrese de que sea un recurso incrustado!

 47
Author: nHibernate User,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-18 13:45:43

Conseguí esto de aquí :

En mi caso, la clase de asignación 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>
 40
Author: basarat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-14 16:13:22

Pasar alrededor de 4 horas en googlear y stackoverflowing , tratando de 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.

 26
Author: Nickmaovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-01 11:27:02

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

Estoy trabajando en MS SQL 2008, pero en la configuración de NH tenía mal dialecto: NHibernate.Dialectal. MsSql2005Dialect si lo corrijo a: NHibernate.Dialectal. MsSql2008Dialect entonces todo está funcionando bien sin excepción " No persister for: ..." David.

 3
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-08 13:04:01

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

 3
Author: Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-24 15:13:50

Para añadir a la respuesta de Amol, no cometas el error de especificar el tipo de clase de Interfaz. asegúrese de especificar la clase de implementación. (IE. no utilice IDomainObjectType). No es que haya cometido este error... :)

 3
Author: goku_da_master,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-28 21:09:50

¿Debería ser name="Id"? Los errores tipográficos 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 adecuado.

¿Puede publicar el mensaje de error completo?

 2
Author: Matt Hinze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-11 23:01:31

Tuve el mismo problema porque estaba agregando el ensamblado incorrecto en la configuración.Método AddAssembly ().

 2
Author: MusuNaji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-27 10:54:28

Si ejecuta pruebas en el repositorio desde un ensamblado separado, asegúrese de Hibernar.cfg.xml se establece como salida siempre en el directorio bin de dicho ensamblado. Esto no estaba sucediendo para nosotros y tuvimos el error anterior en ciertas circunstancias.

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

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-05 15:04:17

No olvide especificar la información de asignación en .archivo de configuración

P. Ej.

Donde MyApp.Los datos son ensamblados que contienen sus asignaciones

 1
Author: zautashvili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-10 23:56:35

Este error se produce debido a una configuración de asignación no válida. Deberías comprobar dónde estás .Asignaciones para su fábrica de sesiones. Básicamente buscar ".Mappings(" en su proyecto y asegúrese de especificar la clase de entidad correcta en la línea inferior.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())
 1
Author: Arkadas Kilic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-18 11:59:46

Tuvo un problema similar al encontrar un objeto por id... Todo lo que hice fue usar el nombre completo en el nombre de la clase. Eso es Antes era :

find("Class",id)

Objeto por lo que se convirtió en así :

find("assemblyName.Class",id)
 0
Author: Jeff Atwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-28 05:18:13

Asegúrese de haber llamado al método CreateCriteria(typeof(DomainObjectType)) en la sesión para el objeto de dominio que intenta obtener de la base de datos.

 0
Author: Amol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 01:33:46