2010-04-02 6 views
11

Sto lavorando alla configurazione di NHibernate per un progetto e ho alcune query che, a causa della loro complessità, lasceremo le stored procedure. Mi piacerebbe essere in grado di utilizzare NHibernate per chiamare gli sproc, ma ho incontrato un errore che non riesco a capire. Dal momento che sto usando Fluent NHibernate sto usando la modalità mista come raccomandato here. Tuttavia, quando eseguo l'app, ottengo un'eccezione "Notazione denominata non nota: AccountsGetSingle" e non riesco a capire perché. Penso che potrei avere un problema con la mia mappatura HBM poiché non ho molta familiarità con il loro utilizzo ma non ne sono sicuro.Errore noto con nome di query che tenta di chiamare un processo memorizzato utilizzando Fluent NHibernate

mio NHibernate codice di configurazione è:

private ISessionFactory CreateSessionFactory() 
{ 
    return Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2005 
      .ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB"))) 
       .ShowSql()) 
     .Mappings(m => 
      { 
       m.HbmMappings.AddFromAssemblyOf<Account>(); 
       m.FluentMappings.AddFromAssemblyOf<Account>(); 
      }) 
     .BuildSessionFactory(); 
} 

Il mio file hbm.xml è:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <sql-query name="AccountsGetSingle"> 
     <return alias="Account" class="Core, Account"></return> 
     exec AccountsGetSingle 
    </sql-query> 
</hibernate-mapping> 

E il codice dove sto chiamando lo sproc assomiglia a questo:

public Account Get() 
{ 
    return _conversation.Session 
     .GetNamedQuery("AccountsGetSingle") 
     .UniqueResult<Account>(); 
} 

Qualsiasi pensiero o idea sarebbe apprezzato. Grazie.

Aggiornamento: @ suggerimento di kibbled_bits me ottenere il risultato finale che sto cercando (Essere in grado di chiamare una stored procedure da NHibernate), ma ancora non so perché l'approccio che ho elencato sopra doesn' lavoro. Sono ancora curioso di sapere perché, poiché potrebbe fornire informazioni preziose sui problemi futuri.

risposta

24

Quando I ha per utilizzare stored procedure (che si verifica solo quando sono forzato a). Sono molto piuttosto uso il seguente metodo per eseguirle:

var list = Session.CreateSQLQuery("exec GetCustomerByNaturalKey ?, ?") 
.AddEntity(typeof(Customer)) 
.SetInt32(0, customerNo) 
.SetDateTime(1, createdDate) 
.List<Customer>(); 

Il primo parametro .SetInt32/DateTime è solo la posizione ordinale del parametro.

+0

Non penso di sapere che è possibile chiamare uno sproc utilizzando .CreateSQLQuery(), anche se ha perfettamente senso. Gli darò una possibilità quando sarò al lavoro al mattino. – Hamman359

+1

Questo ha funzionato perfettamente. Sono stato in grado di chiamare correttamente la mia stored procedure senza problemi. Grazie. – Hamman359

+2

+1 salsa fantastica.Altre risposte implicano la mappatura di uno snippet hbm. Questo è molto meglio. –

17

Ho ricevuto lo stesso messaggio di errore e per me è stato risolto il problema di assicurare che la proprietà del mio file hbm.xml "Build action" fosse impostata su "Embedded Resource", quindi è consigliabile provarla un'altra volta.

+0

Evito il più possibile, quindi la necessità di farlo non è frequente e continuo a dimenticarmi di farlo. – MrBoJangles

1

Sono stato colto da questo errore un numero di volte.

Altri due problemi possono causare questo.

Non aggiungere la mappatura hbm.

In fluente ho il seguente.

var config = Fluently.Configure() 
       .Database(sqlConfig) 
       .Mappings(c => c.AutoMappings.Add(AutoMap.AssemblyOf<AdvertView>(new QueryAutomappingConfiguration()).UseOverridesFromAssemblyOf<AdvertViewMappingOverride>())) 
       .Mappings(c => c.HbmMappings.AddClasses(typeof(AdvertView), typeof(RelatedAdvertView), typeof(CompanyAtoZListingView))); 

Dove mi manca la classe di visualizzazione fuori (che le coppie con un file HBM con le informazioni di mappatura). Ottengo l'errore

Quando ho aggiunto la nuova vista "typeof (CompanyAtoZListingView)" ha funzionato correttamente.

.Mappings(c => c.HbmMappings.AddClasses(typeof(AdvertView), typeof(RelatedAdvertView), typeof(CompanyAtoZListingView))); 

Controllare inoltre nel file hbm per assicurarsi che i parametri siano corretti.

Problemi correlati