Bevor Sie es sagen: Ich habe Google verwendet und meine hbm.xml
Datei ist eine eingebettete Ressource.
Hier ist der Code, den ich anrufe:
ISession session = GetCurrentSession();
var returnObject = session.Get<T>(Id);
Hier ist meine Zuordnungsdatei für die Klasse:
<?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>
Hat jemand schon einmal auf dieses Problem gestoßen?
Hier ist die vollständige Fehlermeldung:
MappingException: Kein Persister für: 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-Ereignis, LoadType loadType) in c: \ CSharp \ NH2.0.0 \ nHibernate \ src \ NHibernate \ Event \ Default \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (LoadEvent-Ereignis, 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 (Typ entityClass, Objekt-ID) in c: \ CSharp \ NH2.0.0 \ nHibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (Objekt-ID) in c: \ CSharp \ NH2.0.0 \ nHibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (Int32-ID) in C: \ Entwicklung \ HQChannelRepo \ HQ-Kanalanwendung \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory () in C: \ Entwicklung \ HQChannelRepo \ HQ-Kanalanwendung \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (Objektabsender, EventArgs e) in C: \ Entwicklung \ HQChannelRepo \ HQ-Kanalanwendung \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 27 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Objekt o, Objekt t, EventArgs e) +15 System.Web .Util.CalliEventHandlerDelegateProxy.Callback (Objektabsender, 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
Update , hier ist die Lösung für mein Szenario: Ich hatte Code geändert und habe die Assembly zur Laufzeit nicht zur Konfigurationsdatei hinzugefügt.
c#
.net
nhibernate
Sara Chipps
quelle
quelle
Antworten:
Klingt so, als hätten Sie vergessen, der Session Factory-Konfiguration eine Mapping-Assembly hinzuzufügen.
Wenn Sie app.config verwenden ...
quelle
Etwas Offensichtliches, aber für jemanden, der neu bei NHibernate ist, sehr nützlich.
Alle XML-Zuordnungsdateien sollten als behandelt werden eingebettete Ressourcen statt der standardmäßigen Inhalt . Diese Option wird festgelegt, indem das Attribut Build Action in den Eigenschaften der Datei bearbeitet wird.
XML-Dateien werden dann in die Assembly eingebettet und beim Projektstart während der Konfigurationsphase von NHibernate analysiert.
quelle
Embedded resource
, aber als ich es von einem Computer auf einen anderen kopierte, verlor die Datei diese Eigenschaft. Ich kratzte mir ein paar gute Minuten am Kopf.Mein Problem war, dass ich vergessen habe, die .hbm in den Namen der Mapping-XML zu setzen. Stellen Sie außerdem sicher, dass Sie es zu einer eingebetteten Ressource machen!
quelle
Ich habe das hier rausgebracht :
In meinem Fall war die Mapping-Klasse nicht öffentlich. Mit anderen Worten, anstatt:
Ich hatte gerade:
quelle
Ich verbringe ungefähr 4 Stunden mit Googeln und Überlaufen von Stapeln und probiere alles dort aus. Ich habe meinen Fehler gefunden:
Meine Zuordnungsdatei hieß .nbm.xml anstelle von .hbm.xml . Das war verrückt.
quelle
Ich hatte ein ähnliches Problem und löste es wie folgt:
Ich arbeite an MS SQL 2008, aber in der NH-Konfiguration hatte ich einen schlechten Dialekt: NHibernate.Dialect.MsSql2005Dialect, wenn ich es korrigiere zu: NHibernate.Dialect. MsSql2008Dialect dann funktioniert ausnahmslos alles einwandfrei "No persister for: ..." David.
quelle
Ich habe während der Initialisierung auch die falsche Assembly hinzugefügt. Die Klasse, die ich beibehalten habe, befindet sich in Assembly Nr. 1, und meine Datei .hbm.xml ist in Assembly Nr. 2 eingebettet. Ich habe geändert
cfg.AddAssembly(...
, um Baugruppe 2 (anstelle von Baugruppe 1) hinzuzufügen, und alles hat funktioniert. Vielen Dank!quelle
Machen Sie nicht den Fehler, den Interface-Klassentyp anzugeben, um Amols Antwort zu ergänzen. Stellen Sie sicher, dass Sie die Implementierungsklasse angeben . (Dh IDomainObjectType nicht verwenden). Nicht dass ich diesen Fehler gemacht hätte ... :)
quelle
Sollte es sein
name="Id"
? Tippfehler sind eine wahrscheinliche Ursache.Als nächstes sollten Sie es mit einem nicht generischen Test ausprobieren, um sicherzustellen, dass Sie den richtigen Typparameter übergeben.
Können Sie die gesamte Fehlermeldung posten?
quelle
Ich hatte das gleiche Problem, weil ich in der Configuration.AddAssembly () -Methode die falsche Assembly hinzugefügt habe.
quelle
Dieser Fehler tritt aufgrund einer ungültigen Zuordnungskonfiguration auf. Sie sollten überprüfen, wo Sie .Mappings für Ihre Session Factory festgelegt haben. Suchen Sie grundsätzlich in Ihrem Projekt nach ".Mappings (" und stellen Sie sicher, dass Sie in der folgenden Zeile die richtige Entitätsklasse angegeben haben.
quelle
Wenn Sie Tests für das Repository von einer separaten Assembly aus ausführen, stellen Sie sicher, dass Ihre Datei Hibernate.cfg.xml so eingestellt ist, dass sie immer im bin-Verzeichnis dieser Assembly ausgegeben wird. Dies passierte für uns nicht und wir haben unter bestimmten Umständen den oben genannten Fehler erhalten.
Haftungsausschluss: Dies kann ein leicht esoterischer Ratschlag sein, da dies ein direktes Ergebnis der Strukturierung unserer Repository-Integrationstest-Assemblys ist (dh wir haben eine symbolische Verknüpfung von jeder Testassembly zu einer einzelnen Hibernate.xfg.xml).
quelle
Vergessen Sie nicht, die Zuordnungsinformationen in der .config-Datei anzugeben
z.B
Dabei ist MyApp.Data eine Assembly, die Ihre Zuordnungen enthält
quelle
Hatte ein ähnliches Problem beim Finden eines Objekts anhand der ID ... Ich habe lediglich den vollständig qualifizierten Namen im Klassennamen verwendet. Das ist, bevor es war:
Objekt so wurde es so:
quelle
Stellen Sie sicher, dass Sie die
CreateCriteria(typeof(DomainObjectType))
Methode für Sitzung für das Domänenobjekt aufgerufen haben, das Sie aus der Datenbank abrufen möchten.quelle
Ich habe ein ähnliches Problem, aber alle genannten Anforderungen sind erfüllt. In meinem Fall versuche ich, eine Entitätsklasse (Typ von OBJEKTE) wieder in der Datenbank zu speichern. Andere Orte funktionieren, aber nur in diesem Fall schlägt dies fehl und löst diese Ausnahme aus.
Meine Lösung (HACK) bestand darin, das Objekt vom Typ OBJEKTE erneut abzubilden und dann zu speichern. Plötzlich funktioniert es. Aber frag nicht warum.
Wenn inparam direkt zu UpdateAsync () wechseln würde, kann kein passender Persistor gefunden werden.
Dies könnte durch die Art und Weise erklärt werden, wie NH dies tut. Es leitet einen Proxy von Ihrer Mapping-Klasse ab und implementiert die Eigenschaften mit eingeschlossener Dirty-Behandlung. Sieh dir das an:
Der Spaß ist jedoch, dass die Quelle
inparam
tatsächlich das NH-Repository selbst ist. Sowieso. Ich bleibe das nächste Mal bei diesem Neuzuweisungs-Hack.quelle