136 votes

NHibernate.MappingException : Aucun persister pour : XYZ

Maintenant, avant de le dire : I a fait Google et mon hbm.xml fichier est une ressource intégrée.

Voici le code que j'appelle :

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

Voici mon fichier de correspondance pour la classe :

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

Quelqu'un a-t-il déjà rencontré ce problème ?

Voici le message d'erreur complet :

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

Mise à jour voici la solution pour mon Le scénario était : J'avais modifié du code et je n'ajoutais pas l'assemblée au fichier de configuration pendant l'exécution.

0 votes

J'ai eu la même erreur, mais un problème différent. Session.Load("SearchItem",searchItemID) en tant que SearchItem renvoie une erreur de mappage, Session.Load<SearchItem>(searchItemID) ne le fait pas (et c'est une façon de faire moins sujette aux erreurs de toute façon.

101voto

Andy S Points 3975

Il semble que vous ayez oublié d'ajouter un assemblage de mappage à la configuration de l'usine de session

Si vous utilisez 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 votes

Comment faire cela dans Fluent NHibernate, je développe un modèle dans un projet Serperate, donc je n'ai pas accès à l'assemblage utilisateur ?

0 votes

Si vous ne pouvez pas référencer l'assemblage utilisateur, je ne pense pas que vous pourrez utiliser Fluent NHibernate.

98voto

Chris Vosnidis Points 626

Quelque chose d'évident, mais pourtant très utile pour quelqu'un qui découvre NHibernate.

Tous les fichiers de mappage XML doivent être traités comme Ressources intégrées plutôt que la valeur par défaut Contenu . Cette option est définie en modifiant l'attribut Build Action dans les propriétés du fichier.

Les fichiers XML sont ensuite incorporés dans l'assemblage et analysés au démarrage du projet pendant la phase de configuration de NHibernate.

1 votes

Haleluia, je l'ai en tant que Embedded resource mais lorsque je l'ai copié d'un ordinateur à un autre, le fichier a perdu cette propriété. Je me suis gratté la tête pendant quelques bonnes minutes.

1 votes

@DragosDurlut le fichier de projet (.csproj) qui enregistre les informations des fichiers de projet, pas le fichier lui-même.

56voto

nHibernate User Points 221

Mon problème est que j'ai oublié de mettre le .hbm dans le nom du mapping xml. Veillez également à en faire une ressource intégrée !

1 votes

C'était mon erreur aussi !

0 votes

C'était aussi mon problème, j'obtiens la même erreur que dans Q quand je fais get. Lorsque j'essaie d'interroger tous les objets de ce type, je n'obtiens pas d'erreur, juste un ensemble de résultats vide !

0 votes

Arg j'avais oublié le .hbm aussi. Merci !

47voto

basarat Points 22425

J'ai trouvé ça sur ici :

Dans mon cas, la classe de mapping n'était pas publique. En d'autres termes, au lieu de :

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

Je viens de le faire :

class UserMap : ClassMap<user>

0 votes

Merci, vous venez de me sauver d'un petit mal de tête. :)

2 votes

Si vous utilisez Fluent, je dirais que c'est la cause la plus commune. Merci, c'était très facile à manquer.

1 votes

Merci. En allant vérifier si j'avais rendu mes classes de mapping publiques ou non, j'ai découvert que je n'avais pas écrit de classe de mapping pour cette entité - oups ! :) Cela m'a fait gagner beaucoup de temps !

30voto

Nickmaovich Points 215

En passant environ 4 heures sur sur le site y pile débordante Après avoir essayé tout ce qu'il y a autour, j'ai trouvé mon erreur :

Mon fichier de cartographie s'appelait .nbm.xml au lieu de .hbm.xml . C'était insensé.

9 votes

Argh, je viens de faire la même chose sauf que je l'avais juste en .xml au lieu de .hbm.xml. Peut-être qu'il devrait y avoir des indications dans les erreurs :)

2 votes

Omg. Je ne peux pas croire que j'ai fait ça. J'ai cherché pendant des heures des erreurs dans les fichiers de cartographie et il s'avère que j'avais fait une faute de frappe dans le nom du fichier... doh. Merci ! Je frémis à l'idée du temps que j'aurais passé à m'arracher les cheveux si je n'étais pas tombé sur ça.

1 votes

Wow, belle prise - je m'arrachais les cheveux sur ce problème. J'ai regardé mon fichier xml une centaine de fois et je n'arrivais pas à comprendre pourquoi il ne fonctionnait pas comme les autres. En fait, il me manquait la partie ".hbm" du nom du fichier. Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X