Pregunta

Tengo un gráfico de objeto básico Cliente / Pedido / Artículo de pedido / Producto. El cliente tiene muchos pedidos, el pedido tiene muchos artículos de pedido, el producto tiene muchos artículos de pedido. Estos se mapean con éxito usando FNH.

Me encontré con un inconveniente al configurar un procedimiento almacenado & amp; Nhibernate fluido. No hay una forma nativa de asignar procedimientos almacenados en FNH con fluidez (versión 1.0 RTM). Había una solución aquí sobre agregar partes a las asignaciones de clase, pero la llamada AddPart se ha eliminado del lanzamiento de FNH.

El procedimiento almacenado es simple:

CREATE PROCEDURE [dbo].[OrderCountByCustomer] 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        c.name as [Customer.Name],
        CAST(count(o.id) as NVARCHAR) as [Customer.OrderCount]
    FROM customer c
        LEFT OUTER JOIN [order] o
        ON o.customer_id = c.id
    GROUP BY c.name

END

Hay un CustomerOrderSummary.hbm.xml en

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NVAble.Orders.Core" namespace="NVAble.Orders.Core">
    <sql-query name="OrderSummary">
        <return class="CustomerOrderSummary">
            <return-property column="Customer.Name" name="CustomerName" />
            <return-property column="Customer.OrderCount" name="OrderCount" /> 
        </return>
        EXEC [OrderCountByCustomer]
    </sql-query>
</hibernate-mapping>

Aquí está la definición de la clase CustomerOrderSummary:

namespace NVAble.Orders.Core
{
    public class CustomerOrderSummary
    {
        virtual public string CustomerName { get; set; }
        virtual public string OrderCount { get; set; }

        public override string ToString()
        {
            return string.Format("{0} {1}", CustomerName, OrderCount);
        }
    }
}

Sin embargo, cuando intento iniciar una sesión de NH, aparece un error en la consulta con nombre OrderSummary sin otros detalles.

Probablemente me estoy perdiendo algo realmente simple que asigna la clase CustomerOrderSummary al procedimiento, no lo sé. Obviamente, ese objeto de dominio no se asigna directamente a una tabla en la base de datos, por lo que no estoy seguro de si funcionaría una <class /> asignación HBM normal.

¡Gracias de antemano!

¿Fue útil?

Solución

Ok, entonces después de un poco más de investigación. Necesitaba una asignación para la clase de dominio, así como un archivo de consulta con nombre hbm.xml.

En mi clase de configuración tengo

config.Mappings(x =>
{
    x.FluentMappings.AddFromAssemblyOf<CustomerMapping>().ExportTo(schemaPath);
    x.HbmMappings.AddFromAssemblyOf<CustomerOrderSummary>();
});

El único inconveniente es que necesito crear manualmente la asignación xml para el procedimiento almacenado, no puedo usar FNH en el momento actual

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top