Свободные NHibernate и хранимые процедуры - PullRequest
4 голосов
/ 28 октября 2009

У меня есть базовый график объекта Customer / Order / OrderItem / Product. У клиента много заказов, у заказа много товаров, у товара много товаров. Они успешно сопоставлены с использованием FNH.

Я столкнулся с проблемой при настройке хранимой процедуры & fluent-nhibernate. Не существует встроенного способа сопоставления хранимых процедур в свободном спящем FNH (версия 1.0 RTM). Было решение здесь о добавлении частей в отображения классов, но вызов AddPart был исключен из выпуска FNH.

Хранимая процедура проста:

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

В

есть CustomerOrderSummary.hbm.xml
<?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>

Вот определение класса 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);
        }
    }
}

Однако при попытке начать сеанс NH я получаю сообщение об ошибке в именованном запросе OrderSummary без других подробностей.

Возможно, мне не хватает чего-то действительно простого, что сопоставляет класс CustomerOrderSummary с процедурой, я не знаю. Этот объект домена, очевидно, не отображается непосредственно в таблицу в базе данных, поэтому я не уверен, сработает ли нормальное отображение <class /> HBM?

Заранее спасибо!

1 Ответ

5 голосов
/ 28 октября 2009

Хорошо, так что после небольшого расследования. Мне нужно было сопоставление для класса домена, а также файл именованного запроса hbm.xml.

В моем классе настройки у меня есть

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

Единственным недостатком является то, что мне нужно вручную создать сопоставление xml для хранимой процедуры, я не могу использовать FNH в настоящее время

...