Frage

Bevor Sie es jetzt sagen:ICH tat Google und mein hbm.xml Datei Ist eine eingebettete Ressource.

Hier ist der Code, den ich aufrufe:

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>

Ist jemand schon einmal auf dieses Problem gestoßen?

Hier ist die vollständige Fehlermeldung:

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

Aktualisieren, hier ist die Lösung dafür Mein Szenario war:Ich hatte Code geändert und habe die Assembly zur Laufzeit nicht zur Konfigurationsdatei hinzugefügt.

War es hilfreich?

Lösung

Klingt wie Sie eine Abbildungsanordnung, um die Sitzung Werkskonfiguration hinzuzufügen vergessen ..

Wenn Sie mit 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>
.
.

Andere Tipps

Etwas offensichtlich, aber sehr nützlich für jemanden neu in NHibernate.

Alle XML-Mapping-Dateien sollten als Embedded Ressourcen anstatt der Standard Content behandelt werden. Diese Option wird durch die Bearbeitung der Build Action-Attribut in den Eigenschaften der Datei.

XML-Dateien werden dann in die Assembly eingebettet, und bei Projektstart während NHibernate Konfigurationsphase analysiert.

Mein Problem war, dass ich die .hbm im Namen des Mapping-xml zu setzen vergessen. Auch stellen Sie sicher, dass es sich um eine eingebettete Ressource zu machen!

Die Ausgaben etwa 4 Stunden auf googeln und stackoverflowing , die alle Sachen versuchen, um dort, ich habe meine Fehler gefunden:

Meine Zuordnungsdatei hieß .nbm.xml statt .hbm.xml . Das war verrückt.

Ich hatte ähnliches Problem, und ich löste es als folows:

ich arbeite auf MS SQL 2008, aber in der NH-Konfiguration Ich hatte schlechten Dialekt: NHibernate.Dialect. MsSql2005Dialect wenn ich richtig es an: NHibernate.Dialect. MsSql2008Dialect dann ist alles gut funktioniert ohne Ausnahme „Nein persister für: ...“ David.

Ich habe auch das Hinzufügen die falsche Montage bei der Initialisierung. Die Klasse ich persistierenden ist in der Montage # 1, und meine .hbm.xml-Datei wird in der Montage # 2 eingebettet. Ich änderte cfg.AddAssembly(... der Montage # 2 (statt Montage # 1) und alles funktionierte hinzufügen. Dank!

Um Amols Antwort zu ergänzen: Machen Sie nicht den Fehler, den Interface-Klassentyp anzugeben. Stellen Sie sicher, dass Sie die Implementierungsklasse angeben.(Dh.verwenden Sie nicht IDomainObjectType).Nicht, dass ich diesen Fehler gemacht hätte...:) :)

Sollte es name="Id" werden? Rechtschreibfehler sind eine wahrscheinliche Ursache.

Als nächstes wäre es auszuprobieren mit einem nicht-generic-Test sicherstellen, dass Sie in der richtigen Art Parameter vorbei sind.

Können Sie die gesamte Fehlermeldung posten?

Ich hatte das gleiche Problem, weil ich die falsche Montage in Configuration.AddAssembly () -Methode hinzugefügt wurde.

Dieser Fehler tritt auf, weil die ungültigen Mapping-Konfiguration. Sie sollten überprüfen, wo Sie .Mappings für Ihre Sitzung Werk eingestellt. Grundsätzlich Suche nach „.Mappings (“ in Ihrem Projekt und stellen Sie sicher, korrekten Entitätsklasse in unterhalb der Linie angegeben.

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

Wenn Ausführen von Tests auf dem Repository von einem separaten Baugruppe, dann stellen Sie sicher, dass Ihre hibernate.cfg.xml zu Ausgang wird immer im Verzeichnis ist die Baugruppe. Dies war nicht für uns passiert, und wir haben die oben genannten Fehler unter bestimmten Umständen.

Disclaimer: Dies könnte ein wenig esoterisch kleinen Rat, wenn man bedenkt, dass es eine direkte Folge ist, wie wir unsere Repository Integration Testanordnungen (dh wir haben einen symbolischen Link von jeder Testanordnung zu einer einzigen Hibernate.xfg.xml) strukturieren

Vergessen Sie nicht, Zuordnungsinformationen in CONFIG-Datei

angeben

z.

wo MyApp.Data ist Assembly, die Ihre Zuordnungen enthält

Sie haben ein ähnliches Problem, wenn ein Objekt von id finden ... Alles, was ich tat, war, der vollständig qualifizierten Namen in den Klassennamen zu verwenden. Das ist Vorher war es:

find("Class",id)

Objekt so es wie folgt wurde:

find("assemblyName.Class",id)

Stellen Sie sicher, dass Sie die CreateCriteria(typeof(DomainObjectType)) Methode auf Session für die Domain-Objekt aufgerufen haben, die Sie Absicht von DB zu holen.

scroll top