Question

Maintenant, avant de le dire :je a fait Google et mon hbm.xml déposer 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 mappage 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 à quoi sert la solution mon le scénario était :J'avais modifié du code et je n'ajoutais pas l'assembly au fichier de configuration pendant l'exécution.

Était-ce utile?

La solution

On dirait que vous avez oublié d'ajouter un assembly de mappage à la configuration de la fabrique 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>
.
.

Autres conseils

Quelque chose d'évident, mais 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 intégrés dans l'assembly et analysés au démarrage du projet pendant la phase de configuration de NHibernate.

Mon problème était que j'avais oublié de mettre le .hbm au nom du XML de mappage.Assurez-vous également d’en faire une ressource intégrée !

J'ai enlevé ça de ici:

Dans mon cas, la classe de mappage n'était pas publique.Autrement dit, au lieu de :

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

Je viens d'avoir:

class UserMap : ClassMap<user>

Passer environ 4 heures dessus googler et débordement de pile, en essayant tout ce qui se passe là-bas, j'ai trouvé mon erreur :

Mon fichier de mappage s'appelait .nbm.xml au lieu de .hbm.xml.C'était fou.

J'ai eu un problème similaire et je l'ai résolu comme suit :

Je travaille sur MS SQL 2008, mais dans la configuration NH j'avais un mauvais dialecte :NHibernate.Dialecte.MsSql2005Dialectesi je le corrige en :NHibernate.Dialecte.MsSql2008Dialectealors tout fonctionne bien sans exception "Pas de persistant pour :..." David.

J'ajoutais également le mauvais assembly lors de l'initialisation.La classe que je persiste se trouve dans l'assembly n°1 et mon fichier .hbm.xml est intégré dans l'assembly n°2.j'ai changé cfg.AddAssembly(... pour ajouter l'assemblage n°2 (au lieu de l'assemblage n°1) et tout a fonctionné.Merci!

Pour compléter la réponse d'Amol, ne commettez pas l'erreur de spécifier le type de classe Interface. Assurez-vous de spécifier la classe d'implémentation.(C'est à dire.n'utilisez pas IDomainObjectType).Non pas que j'ai commis cette erreur...:)

Devrait-ce être name="Id"?Les fautes de frappe sont une cause probable.

Ensuite, vous devriez l'essayer avec un test non générique pour vous assurer que vous transmettez le paramètre de type approprié.

Pouvez-vous poster l'intégralité du message d'erreur ?

J'ai eu le même problème car j'ajoutais le mauvais assembly dans la méthode Configuration.AddAssembly().

Cette erreur se produit en raison d’une configuration de mappage non valide.Vous devriez vérifier où vous définissez .Mappings pour votre fabrique de sessions.Recherchez essentiellement ".Mappings(" dans votre projet et assurez-vous d'avoir spécifié la classe d'entité correcte dans la ligne ci-dessous.

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

Si vous exécutez des tests sur le référentiel à partir d'un assembly séparé, assurez-vous que votre Hibernate.cfg.xml est défini pour toujours afficher dans le répertoire bin dudit assembly.Cela ne s'est pas produit pour nous et nous avons eu l'erreur ci-dessus dans certaines circonstances.

Clause de non-responsabilité:Cela pourrait être un conseil légèrement ésotérique, étant donné que c'est le résultat direct de la façon dont nous structurons nos assemblys de test d'intégration de référentiel (c'est-à-direnous avons un lien symbolique de chaque assembly de test vers un seul Hibernate.xfg.xml)

N'oubliez pas de spécifier les informations de mappage dans le fichier .config

par exemple.

où MyApp.Data est l'assembly qui contient vos mappages

J'ai eu un problème similaire lors de la recherche d'un objet par identifiant...Tout ce que j'ai fait, c'est d'utiliser le nom complet dans le nom de la classe.C'est avant qu'il ne soit:

find("Class",id)

Objet donc c'est devenu comme ça :

find("assemblyName.Class",id)

Assurez-vous d'avoir appelé le CreateCriteria(typeof(DomainObjectType)) méthode sur Session pour l'objet de domaine que vous avez l'intention de récupérer à partir de la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top