2008-09-11 14 views
122

Ahora, antes de decir: yo hice Google y mi archivo hbm.xml es un recurso incrustado.NHibernate.MappingException: No persister para: XYZ

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 dirigido a este problema antes?

Aquí es 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, esto es lo que era la solución para mi escenario: había cambiado algo de código y no me deje que el montaje en el fichero de configuración durante el tiempo de ejecución.

+0

que tenía el mismo error, sino una cuestión diferente. Session.load ('SearchItem', searchItemID) como SearchItem devuelve un error de asignación, Session.Load (searchItemID) no (y es una forma menos propensa a errores de hacerlo de todos modos). – Kendrick

Respuesta

89

Suena como que se olvidó de añadir un montaje de mapeo a la configuración de fábrica de sesiones ..

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> 
. 
. 
+7

¿Cómo hacer esto en Fluither NHibernate, estoy desarrollando un patrón en un proyecto serperado, por lo que no tengo acceso al ensamblado del usuario? –

+0

Si no puede hacer referencia al ensamblado del usuario, no creo que pueda usar Fluent NHibernate. –

2

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

Lo siguiente sería intentarlo 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?

1

Si la ejecución de pruebas en el repositorio de una Ensamblaje separado, luego 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 desde cada ensamblaje de prueba a un solo Hibernate.xfg.xml)

0

Tuve un problema similar al encontrar un objeto por id ... Todo lo que hice fue utilizar el nombre completo en el nombre de la clase. Es decir Antes era:

find("Class",id) 

objeto por lo que llegó a ser de esta manera:

find("assemblyName.Class",id) 
75

algo obvio, pero muy útil para alguien nuevo en NHibernate.

Todos los archivos de mapeo XML deben ser tratados como recursos incrustados lugar de la predeterminada contenido. 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.

+1

Haleluia, lo tengo como un 'Recurso incrustado', pero cuando lo copié de una computadora a otra, el archivo perdió esta propiedad. Me rasqué la cabeza por un par de buenos minutos. –

+1

@DragosDurlut el archivo de proyecto (.csproj) que guarda la información de los archivos de proyecto, no el archivo en sí. –

+0

Danke Mecie Chris – afarazit

1

No se olvide de especificar la información de asignación en el archivo .config

por ejemplo,

donde MyApp.Data es ensamblado que contiene las asignaciones de

3

tuve un problema similar y lo resolví como folows:

yo trabajando en MS SQL 2008, pero en la configuración NH tuve mala dialecto : NHibernate.Dialect. MsSql2005Dialeccionar si lo corrijo a: NHibernate.Dialect. MsSql2008Dialect entonces todo funciona correctamente sin excepción "No persister for: ..." David.

45

Mi problema es que olvidé poner .hbm en el nombre de la asignación xml. ¡Asegúrate también de convertirlo en un recurso incrustado!

+1

¡Ese también fue mi error! – Gringo

+1

¡hice lo mismo! –

+1

Sí, el "recurso incrustado" fue mi error. ¡Gracias! – Max

39

Tengo esta fuera de here:

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! 

sólo tenía:

class UserMap : ClassMap<user> 
+0

Gracias, me salvaste de un poco de dolor de cabeza. :) – Rytmis

+1

Si usa Fluent, diría que esta sería la causa más común. Gracias, eso fue muy fácil de extrañar. –

+0

Gracias! Al revisar si había hecho públicas o no mis clases de mapeo, descubrí que no había escrito una clase de mapeo para esta entidad, ¡vaya! :) ¡Me ahorró montones de tiempo! – Jen

2

que tenían el mismo problema porque yo estaba deje que el montaje incorrecto en Configuration.AddAssembly método().

2

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 ensamblaje # 2 (en lugar del ensamblaje n. ° 1) y todo funcionó. ¡Gracias!

0

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

+0

Esto es una persistencia, no una búsqueda. –

3

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 hice este error ... :)

23

Pasar unas 4 horas en googlear y stackoverflowing, tratando todas las cosas por ahí, he encontrado mi error:

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

+8

Argh, acabo de hacer lo mismo, excepto que lo tenía como .xml en lugar de .hbm.xml. Tal vez debería haber algunas pistas en los errores :) – Rezler

+2

omg. No puedo creer que hice esto. Estuve buscando durante horas mapeando archivos por errores y resultó que había hecho un error tipográfico en el nombre del archivo ... doh. ¡Gracias! Me estremezco al pensar cuánto tiempo me habría estado rasgando los pelos si no hubiera tropezado con esto. – kamui

+5

jaja, la primera vez que escuché la expresión "stackoverflowing" –

1

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 buscar ".Mappings (" en su proyecto y asegurarse de que ha especificado la clase de entidad correcta en la línea de abajo.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>()) 
+0

gracias amigo! ¡Cambié el proyecto en el que estaban sentadas mis entidades! – viggity

Cuestiones relacionadas