Domanda

Ho un grafico oggetto cliente / ordine / ordine / articolo di base. Il cliente ha molti ordini, l'ordine ha molti articoli, il prodotto ha molti articoli. Questi sono mappati con successo usando FNH.

Ho avuto un problema con la configurazione di un ampli & di stored procedure; fluente-NHibernate. Non esiste un modo nativo per mappare le procedure memorizzate in FNH fluente ibernazione (versione 1.0 RTM). C'era una soluzione qui sull'aggiunta di parti ai mapping di classe ma la chiamata AddPart è stata eliminata dal rilascio di FNH.

La procedura memorizzata è semplice:

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

C'è un CustomerOrderSummary.hbm.xml in

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

Ecco la def della classe 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);
        }
    }
}

Tuttavia, quando provo ad avviare una sessione NH ricevo un errore nella query denominata OrderSummary senza altri dettagli.

Probabilmente mi manca qualcosa di veramente semplice che associa la classe CustomerOrderSummary alla procedura, non lo so. Quell'oggetto dominio ovviamente non viene mappato direttamente a una tabella nella base di dati, quindi non sono sicuro che avere una normale <class /> mappatura HBM funzionerebbe?

Grazie in anticipo!

È stato utile?

Soluzione

Ok, quindi dopo un po 'più di indagine. Avevo bisogno di una mappatura per la classe di dominio e di un file hbm.xml con query denominata.

Nella mia classe di configurazione ho

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

L'unico inconveniente è che devo creare manualmente la mappatura xml per la procedura memorizzata, al momento non posso usare FNH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top