visual ventajas uso una stored salida recuperar qué procedimientos procedimiento parametros parametro net llamar ejecutar desde datos con como aporta almacenados almacenado nhibernate fluent-nhibernate nhibernate-mapping

ventajas - Error de consulta con nombre no conocido al tratar de llamar a un proceso almacenado utilizando Fluent NHibernate



qué ventajas aporta el uso de procedimientos almacenados en una base de datos (3)

Cuando tengo que usar procedimientos almacenados (lo cual solo ocurre cuando estoy forzado). Prefiero usar 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 para .SetInt32 / DateTime es simplemente la posición ordinal del parámetro.

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 uso Fluent NHibernate, estoy usando el mapeo de modo mixto como se recomienda aquí . 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.

El código de configuración de NHibernate 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 al que estoy llamando el sproc se ve así:

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

Cualquier pensamiento o idea sería apreciada. Gracias.

Actualización: la sugerencia de @ kibbled_bits me da el resultado final que estoy buscando (poder llamar a un procedimiento almacenado de NHibernate), pero todavía no sé por qué el enfoque que he enumerado arriba no funciona. Todavía tengo curiosidad de por qué, ya que podría proporcionar información valiosa sobre problemas futuros.


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 como "Recurso incrustado", por lo que es posible que desee probarlo otra vez.


Este error me ha sorprendido varias veces.

Otros dos problemas pueden causar esto.

No agregando el mapeo hbm.

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

Donde extraño la clase de vista (que se combina con un archivo hbm con la información de mapeo). 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.