Domanda

Ora, prima di dire che:Io fatto Google e il mio hbm.xml file è una Risorsa Incorporata.

Qui è il codice che sto chiamando:

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

Ecco il mio file di mapping per 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>

Qualcuno ha eseguito a questo problema prima?

Qui è pieno il messaggio di errore:

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

Aggiornamento, ecco la soluzione per il mio scenario:Avevo cambiato un po ' di codice e non mi è stato aggiunta l'Assemblea per il file di configurazione durante il runtime.

È stato utile?

Soluzione

Suona come hai dimenticato di aggiungere un mapping assemblea per la sessione di configurazione di fabbrica..

Se stai usando l'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>
.
.

Altri suggerimenti

Qualcosa di ovvio, ma molto utile per qualcuno di nuovo a NHibernate.

Tutti i file di Mapping XML devono essere trattati come Le Risorse Incorporate piuttosto che il default Contenuto.Questa opzione è impostata modificando l'attributo Build Action nelle proprietà del file.

I file XML sono poi integrati in assemblea, e analizzato durante l'avvio del progetto nel corso del NHibernate fase di configurazione.

Il mio problema è che ho dimenticato di mettere la .hbm in nome di mapping xml.Inoltre, assicurarsi che si fanno una risorsa incorporata!

Ho ottenuto questo off di qui:

Nel mio caso la classe di mapping non era pubblica.In altre parole, invece di:

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

Ho appena avuto:

class UserMap : ClassMap<user>

La spesa di circa 4 ore googling e stackoverflowing, di provare tutte le cose intorno, ho trovato il mio errore:

Il mio file di mapping è stato chiamato .nbm.xml invece di .hbm.xml.Che era pazzo.

Ho avuto un problema simile e ho risolto come segue:

Io lavoro su MS SQL 2008, ma nel NH configurazione ho avuto brutte dialetto:NHibernate.Il dialetto.MsSql2005Dialect se ho corretto il tutto a:NHibernate.Il dialetto.MsSql2008Dialect poi tutto sta funzionando bene senza eccezione "No persister per:..." David.

Mi è stato anche l'aggiunta di un errato montaggio durante l'inizializzazione.La classe sono persistenti in assemblea #1, e la mia .hbm.xml file è incorporato in assemblea #2.Ho cambiato cfg.AddAssembly(... per aggiungere assemblea #2 (invece di assemblaggio #1) e tutto ha funzionato.Grazie!

Per aggiungere a Amol risposta, non fare l'errore di specificare la classe di Interfaccia di tipo. Assicurarsi di specificare la classe di implementazione.(Ie.non utilizzare IDomainObjectType).Non è che ho fatto questo errore...:)

Dovrebbe essere name="Id"?Gli errori di battitura sono una causa probabile.

Successivo sarebbe quello di provare con un non generico di prova per assicurarsi che si sta passando il corretto parametro di tipo.

Puoi postare l'intero messaggio di errore?

Ho avuto lo stesso problema, perché stavo aggiungendo l'errato montaggio in Configurazione.AddAssembly() metodo.

Questo errore si verifica a causa di voci di configurazione mapping.Si dovrebbe controllare dove si imposta .Mapping per la sessione di fabbrica.Fondamentalmente cercare ".Mapping(" nel progetto e assicurarsi che è specificato corretta classe di entità in al di sotto della linea.

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

Se l'esecuzione di prove sui repository da un separato assieme, quindi assicuratevi che il vostro Hibernate.cfg.xml è impostato per l'uscita sempre nella directory bin di detta assemblea.Questo non accade per noi e abbiamo ottenuto l'errore di cui sopra, in determinate circostanze.

Disclaimer:Questo potrebbe essere un po 'esoterica po' di consigli, dato che si tratta di una diretta conseguenza di come si struttura la repository di test di integrazione assemblee (es.abbiamo un link simbolico da ogni montaggio di prova per un singolo Hibernate.xfg.xml)

Non dimenticare di specificare le informazioni di mapping in .file di configurazione

ad es.

MyApp.Dati assembly che contiene il mapping

Ha avuto un problema simile quando trova un oggetto da id...Tutto quello che ho fatto è stato quello di utilizzare il nome completo, il nome della classe.Che è Prima era :

find("Class",id)

Oggetto divenne così simile a questo :

find("assemblyName.Class",id)

Assicurarsi che voi avete chiamato CreateCriteria(typeof(DomainObjectType)) metodo di Sessione per il dominio in oggetto, che è intento a recuperare dal DB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top