2010-04-02 4 views
11

pracuję nad konfigurowania NHibernate dla projektu i mam kilka pytań, które, ze względu na ich złożoność, będziemy pozostawiając jako procedur przechowywanych. Chciałbym móc użyć NHibernate do wywoływania sprocsów, ale napotkałem błąd, którego nie mogę zrozumieć. Ponieważ używam Fluent NHibernate używam mapowania w trybie mieszanym zgodnie z zaleceniami here. Jednak po uruchomieniu aplikacji otrzymuję wyjątek "nieznany nieznany kwerenda: AccountsGetSingle" i nie mogę zrozumieć, dlaczego. Myślę, że mógłbym mieć problem z mapowaniem HBM, ponieważ nie jestem bardzo obeznany z ich używaniem, ale nie jestem pewien.Nazwany kwerendy nie znany błąd próbując wywołać przechowywanej proc użyciu Fluent NHibernate

My NHibernate kod konfiguracji:

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(); 
} 

Mój plik hbm.xml jest:

<?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> 

I kod gdzie jestem wywołanie sproc wygląda następująco:

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

Wszelkie przemyślenia i pomysły będą mile widziane. Dzięki.

Aktualizacja: @ sugestią kibbled_bits Get mi wynik końcowy, który szukam (Być zdolnym do wywołania procedury przechowywanej z NHibernate), ale nadal nie wiem, dlaczego podejście mam wymienione powyżej nie robi” t działa. Wciąż jestem ciekawy dlaczego, ponieważ może to dostarczyć cennego wglądu w przyszłe problemy.

Odpowiedz

24

Gdy mam mam używać procedur przechowywanych (co ma miejsce tylko wtedy, gdy jestem do tego zmuszony). Ja dużo raczej użyć następującej metody do ich wykonania:

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

Pierwszym parametrem .SetInt32/DateTime jest tylko porządkowa pozycji parametru.

+0

Nie sądzę, wiedziałem, że można nazwać sproc korzystając .CreateSQLQuery(), chociaż to ma sens. Zrobię zastrzyk, kiedy rano zabiorę się do pracy. – Hamman359

+1

To działało idealnie. Udało mi się pomyślnie wywołać procedurę przechowywaną bez żadnych problemów. Dzięki. – Hamman359

+2

+1 niesamowity sos.Inne odpowiedzi obejmują odwzorowanie fragmentu hbm. To jest dużo lepsze. –

17

Otrzymałem ten sam komunikat o błędzie, a dla mnie rozwiązaniem było upewnienie się, że moja właściwość pliku hbm.xml "Działanie kompilacji" została ustawiona na "Osadzone zasoby", więc możesz spróbować jeszcze raz.

+0

Unikałem proców tak bardzo, jak to możliwe, więc trzeba to robić rzadko i ciągle zapominam o tym. – MrBoJangles

1

Zostałem złapany przez tego błędu kilka razy.

Mogą to być dwa inne problemy.

Nie dodając mapowanie HBM.

W biegle Mam następujący.

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))); 

Tam, gdzie brakuje mi klasy widoku (która łączy się z plikiem hbm z informacjami mapowania). Dostaję błąd.

Kiedy dodałem nowy widok „typeof (CompanyAtoZListingView)” to działało dobrze.

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

Sprawdź również w pliku hbm, aby upewnić się, że parametry są poprawne.