2010-04-02 12 views
11

Estoy trabajando en la configuración de NHibernate para un proyecto y tengo algunas consultas que, debido a su complejidad, dejaremos como procedimientos almacenados. Me gustaría poder usar NHibernate para llamar a los sprocs, pero me he encontrado con un error que no logro resolver. Como estoy usando Fluiber NHibernate, estoy usando la asignación de modo mixto como se recomienda here. Sin embargo, cuando ejecuto la aplicación recibo una excepción de "consulta no conocida conocida: AccountsGetSingle" y no puedo entender por qué. Creo que podría tener un problema con mi mapeo HBM ya que no estoy muy familiarizado con su uso, pero no estoy seguro.Llamada con nombre error no conocido al intentar llamar a un proceso almacenado utilizando Fluent NHibernate

Mi NHibernate código de configuración es:

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

Mi archivo hbm.xml es:

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

Y el código donde yo estoy llamando a la sproc se ve así:

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

Cualquier pensamiento o idea sería apreciada. Gracias.

Actualización: @ sugerencia de kibbled_bits me conseguir el resultado final que estoy buscando (Ser capaz de llamar a un procedimiento almacenado de NHibernate), pero todavía no sé por qué el enfoque que he mencionado anteriormente doesn' t trabajo. Todavía tengo curiosidad de por qué, ya que podría proporcionar información valiosa sobre problemas futuros.

Respuesta

24

Cuando I tengo para utilizar procedimientos almacenados (que solo se produce cuando estoy obligado). Yo preferiría utilizar el siguiente método para ejecutarlos:

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

El primer parámetro a .SetInt32/DateTime es sólo la posición ordinal del parámetro.

+0

No creo que supiera que podría llamar a un sproc usando .CreateSQLQuery(), aunque tiene mucho sentido. Le daré una oportunidad cuando llegue a trabajar por la mañana. – Hamman359

+1

Esto funcionó perfectamente. Pude llamar con éxito mi procedimiento almacenado sin ningún problema. Gracias. – Hamman359

+2

+1 salsa increíble.Otras respuestas implican mapear un fragmento de hbm. Esto es mucho mejor. –

17

Recibí el mismo mensaje de error y lo que me solucionó fue asegurarme de que mi propiedad de archivo hbm.xml "Acción de compilación" estaba configurada en "Recurso incrustado", por lo que es posible que desee probarlo nuevamente.

+0

Evito los procesos tanto como sea posible, por lo que la necesidad de hacer esto es poco frecuente y sigo olvidándome de hacer esto. – MrBoJangles

1

He sido atrapado por este error varias veces.

Otros dos problemas pueden causar esto.

Sin agregar la asignación hbm.

En fluidez tengo lo siguiente.

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

Cuando echo de menos la clase de vista a cabo (que pares con un archivo de HBM con la información de asignación). Me sale el error

Cuando agregué la nueva vista 'typeof (CompanyAtoZListingView)' funcionó bien.

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

También verifique en el archivo hbm para asegurarse de que los parámetros sean correctos.

Cuestiones relacionadas