2009-10-28 2 views
3

У меня есть базовый графа Customer/Order/OrderItem/Product object. У Клиента много ордеров, у Ордена есть много предметов заказа, у Продукта много предметов заказа. Они успешно отображаются с использованием FNH.Fluent NHibernate и хранимые процедуры

Я попал в зацепку с настройкой хранимой процедуры & fluent-nhibernate. Существует нет родного способа сопоставления хранимых процедур в свободно-спящем FNH (версия 1.0 RTM). Было решение here о добавлении компонентов в сопоставления классов, но вызов 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 Защита:

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 будет работать?

Заранее благодарен!

+0

пожалуйста форматировать код –

+0

Я форматировал код, выглядел нормально в предварительном просмотре, fubared в сообщении. Наиболее раздражает. –

ответ

5

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

В моем классе я конфигурирования есть

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

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