Pergunta

Eu tenho um cliente básico / OrderItem / gráfico do objeto / pedido do produto. Cliente tem muitas ordens, Ordem tem muitos itens Ordem, O produto tem muitos itens da Ordem. Estes são mapeados com sucesso usando FNH.

Eu já atingiu um problema com a configuração de um procedimento e fluente nhibernate armazenado. Não é de forma nativa para mapear procedimentos armazenados em fluente-hibernação FNH (versão 1.0 RTM). Havia uma solução aqui sobre a adição de partes para mapeamentos de classe, mas a chamada AddPart foi retirado da liberação de FNH.

O procedimento armazenado é simples:

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

Há uma CustomerOrderSummary.hbm.xml em

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

Aqui é a classe CustomerOrderSummary def:

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

No entanto, quando tenta iniciar uma sessão de NH eu recebo erro no OrderSummary consulta nomeada sem outros detalhes.

Eu sou provavelmente faltando alguma coisa realmente simples que mapeia a classe CustomerOrderSummary ao procedimento, eu não sei. Esse objeto de domínio, obviamente, não mapeia diretamente para uma tabela na base de dados para que eu não tenho certeza se ter um mapeamento normal, <class /> HBM iria trabalhar?

Agradecemos antecipadamente!

Foi útil?

Solução

Ok, então depois de um pouco mais de investigação. Eu precisava de um mapeamento para a classe de domínio, bem como um arquivo de consulta hbm.xml nomeado.

Na minha classe configure eu tenho

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

A única desvantagem é que eu preciso para criar manualmente o mapeamento XML para o procedimento armazenado, eu não posso usar FNH no momento atual

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top