Question

J'ai un graphe d'objet Client / Order / OrderItem / Product de base. Le client a plusieurs commandes, la commande a de nombreux articles de commande, le produit a de nombreux articles de commande. Celles-ci sont correctement mappées avec FNH.

J'ai rencontré un problème avec la configuration d'une procédure stockée & amp; fluent-nhibernate. Il n'existe pas de méthode native pour mapper les procédures stockées dans FNH couramment-hiberné (version 1.0 RTM). Il y avait une solution ici sur l’ajout de pièces aux mappages de classes, mais l’appel AddPart a été retiré de la version de FNH.

La procédure stockée est 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

Il existe un CustomerOrderSummary.hbm.xml dans

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

Voici la définition de la 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);
        }
    }
}

Cependant, lorsque j'essaie de démarrer une session NH, une erreur s'est produite dans la requête nommée OrderSummary sans autre détail.

Je manque probablement quelque chose de très simple qui mappe la CustomerOrderSummary classe à la procédure, je ne sais pas. De toute évidence, cet objet de domaine ne mappe pas directement sur une table de la base de données; par conséquent, je ne suis pas sûr d'avoir un mappage <class /> HBM normal?

Merci d'avance!

Était-ce utile?

La solution

Ok, donc après un peu plus d’investigation. J'avais besoin d'un mappage pour la classe de domaine ainsi que d'un fichier nommé hbm.xml de requête.

Dans ma classe de configuration, j'ai

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

Seul inconvénient, je dois créer manuellement le mappage xml pour la procédure stockée. Je ne peux pas utiliser FNH à l'heure actuelle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top