Maintenant, avant de le dire: j'ai 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 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: Pas de persistance pour: HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName, Boolean throwIfNotFound) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad (événement LoadEvent, LoadType loadType) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (événement LoadEvent, LoadType loadType) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (String entityName, Object id) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1029 NHibernate.Impl.SessionImpl.Get (Type entityClass, Object id) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (ID d'objet) dans c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Int32 Id) dans C: \ Development \ HQChannelRepo \ HQ Channel Application \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory () dans C: \ Development \ HQChannelRepo \ HQ Channel Application \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (Expéditeur d'objet, EventArgs e) dans 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 (Expéditeur de l'objet, EventArgs e) +33 System.Web.UI.Control.OnLoad (EventArgs e) +99 System.Web.UI.Control.LoadRecursive () +47 System.Web.UI.Page .ProcessRequestMain (booléen includeStagesBeforeAsyncPoint, booléen includeStagesAfterAsyncPoint) +1436
Mise à jour , voici la solution pour mon scénario: j'avais changé du code et je n'ajoutais pas l'assembly au fichier de configuration pendant l'exécution.
c#
.net
nhibernate
Sara Chipps
la source
la source
Réponses:
On dirait que vous avez oublié d'ajouter un assemblage de mappage à la configuration de la fabrique de session.
Si vous utilisez app.config ...
la source
Quelque chose d'évident, mais tout à fait utile pour quelqu'un de nouveau sur NHibernate.
Tous les fichiers de mappage XML doivent être traités comme des ressources incorporées plutôt que comme du contenu par défaut . Cette option est définie en modifiant l'attribut Action de construction 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.
la source
Embedded resource
, mais quand 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.Mon problème était que j'avais oublié de mettre le .hbm dans le nom du mappage xml. Assurez-vous également d'en faire une ressource intégrée!
la source
J'ai eu ça d' ici :
Dans mon cas, la classe de mappage n'était pas publique. En d'autres termes, au lieu de:
Je viens tout juste d'avoir:
la source
Passer environ 4 heures sur Google et le stackoverflowing , à essayer tout ce qui se trouve là-bas, j'ai trouvé mon erreur:
Mon fichier de mappage s'appelait .nbm.xml au lieu de .hbm.xml . C'était insensé.
la source
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.Dialect. MsSql2005Dialect si je le corrige à: NHibernate.Dialect. MsSql2008Dialect alors tout fonctionne bien sans exception "Pas de persistance pour: ..." David.
la source
J'ajoutais également le mauvais assemblage lors de l'initialisation. La classe que je persiste est 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!la source
Pour ajouter à la réponse d'Amol, ne faites pas l'erreur de spécifier le type de classe Interface. Assurez-vous de spécifier la classe d'implémentation . (Par exemple, n'utilisez pas IDomainObjectType). Non pas que j'ai fait cette erreur ... :)
la source
Doit-il l'être
name="Id"
? Les fautes de frappe sont une cause probable.La prochaine étape serait de l'essayer avec un test non générique pour vous assurer que vous passez le paramètre de type approprié.
Pouvez-vous publier l'intégralité du message d'erreur?
la source
J'ai eu le même problème car j'ajoutais le mauvais assemblage dans la méthode Configuration.AddAssembly ().
la source
Cette erreur se produit en raison d'une configuration de mappage non valide. Vous devriez vérifier où vous avez défini .Mappings pour votre fabrique de session. Recherchez essentiellement ".Mappings (" dans votre projet et assurez-vous que vous avez spécifié la classe d'entité correcte dans la ligne ci-dessous.
la source
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 sortir dans le répertoire bin dudit assembly. Cela ne se produisait pas pour nous et nous avons eu l'erreur ci-dessus dans certaines circonstances.
Avertissement: Cela pourrait être un conseil légèrement ésotérique, étant donné que c'est un résultat direct de la façon dont nous structurons nos assemblys de test d'intégration de référentiel (c'est-à-dire que nous avons un lien symbolique de chaque assemblage de test vers un seul Hibernate.xfg.xml)
la source
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
la source
J'ai eu un problème similaire lors de la recherche d'un objet par identifiant ... Tout ce que j'ai fait était d'utiliser le nom complet dans le nom de la classe. C'est avant qu'il ne soit:
Objet donc c'est devenu comme ça:
la source
Assurez-vous que vous avez appelé la
CreateCriteria(typeof(DomainObjectType))
méthode sur Session pour l'objet de domaine que vous avez l'intention d'extraire de DB.la source
J'ai un problème similaire mais toutes les conditions mentionnées sont remplies. Dans mon cas, j'essaie de sauvegarder une classe d'entité (Type d'OBJEKTE) dans la base de données. D'autres endroits fonctionnent mais seulement dans ce cas, cela échoue et lève cette exception.
Ma solution (HACK) était de re-mapper l'objet de type OBJEKTE et de le stocker ensuite. Soudain, ça marche. Mais ne demandez pas pourquoi.
Si inparam irait directement à UpdateAsync (), il ne peut pas trouver de persistance correspondante.
Cela pourrait s'expliquer par la manière dont NH fait cela. Il dérive un proxy de votre classe de mappage et implémente les propriétés avec une gestion sale incluse. Regarde ça:
Ce qui est amusant, c'est que la source de
inparam
est en fait le référentiel NH lui-même. Bref. Je reste avec ce hack de réaffectation pour la prochaine fois.la source