2009-11-26 2 views
3

Когда я карта столбцы из таблицы проверяемого, я это сделать:NHibernate отображение свойство: колонки и формула

<property name="InstanceName" type="MyNameUserType, MyApp.MyNamespace"> 
    <column name="Name"/> 
    <column name="Name2"/> 
</property> 

Как можно сделать отображение свойство инициализации UserType с данными, полученными с помощью SQL-запроса с детским?

<property name="InstanceName" type="MyNameUserType, MyApp.MyNamespace" formula="(...)"/> 

сбой исключение «неправильное количество столбцов».

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

ответ

1

MyUserNameType должно быть отображением уровня класса, чтобы вы могли сопоставить результат функции SQL с классом. Смотрите эти два сообщения по какой-то возможной помощи:

  1. класса и SQL функции Пример: http://thoughtspam.spaces.live.com/blog/cns!253515AE06513617!478.entry

  2. NHibernate Отображение с примером формула отображения: http://thoughtspam.spaces.live.com/blog/cns!253515AE06513617!477.entry

+0

благодарит за ответ. Я пробовал, как вы предоставили в post2, но ничего мне не дал. похоже, что UserType просто не видит столбец результирующего набора данных :( – npeBeg

+7

Отправленная связь не работает для меня. –

+2

Этот пост старше года. Я не контролирую интернетов. ! –

1

Я автор статьи, на которые ссылается Майкл. Я понятия не имел людей, которые все еще интересуются, и я не уверен, что это применимо к последнему NHibernate. Вот свежая ссылка, хотя: http://thoughtspam.wordpress.com/2007/12/19/nhibernate-property-with-formula/

пример, используя Борей ...

Mapping:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="PropertyFormulaExample.Shipper, PropertyFormulaExample" table="Shippers" lazy="false" > 
     <id name="ShipperID" column="ShipperID" unsaved-value="0"> 
      <generator class="native" /> 
     </id> 
     <property name="CompanyName" column="CompanyName" /> 
     <property name="Phone" column="Phone" /> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="PropertyFormulaExample.Order, PropertyFormulaExample" table="Orders" lazy="false"> 
     <id name="OrderID" column="OrderID" unsaved-value="0"> 
      <generator class="native" /> 
     </id> 
     <property name="CustomerID" column="CustomerID" /> 
     <property name="ShipVia" type="PropertyFormulaExample.Shipper, PropertyFormulaExample" formula="dbo.GetShipper(shipvia)" /> 
    </class> 
</hibernate-mapping> 

Объекты:

public class Order 
{ 
    public int OrderID { get; set; } 
    public string CustomerID { get; set; } 
    public Shipper ShipVia { get; set; } 
} 

public class Shipper : ILifecycle 
{ 
    public int ShipperID { get; set; } 
    public string CompanyName { get; set; } 
    public string Phone { get; set; } 
    #region ILifecycle Members 
    public LifecycleVeto OnDelete(NHibernate.ISession s) 
    { 
     throw new NotImplementedException(); 
    } 
    public void OnLoad(NHibernate.ISession s, object id) 
    { 
    } 
    public LifecycleVeto OnSave(NHibernate.ISession s) 
    { 
     throw new NotImplementedException(); 
    } 
    public LifecycleVeto OnUpdate(NHibernate.ISession s) 
    { 
     throw new NotImplementedException(); 
    } 
    #endregion 

}

И, наконец, SQL функция:

CREATE FUNCTION dbo.GetShipper(@shipperId int) 
RETURNS int 
AS 
BEGIN 
RETURN @shipperId 
END 

Очевидно, что вы хотите, чтобы функция делала что-то значимое, но идея заключается в том, что вы возвращаете PK для объекта и реализуете ILifecycle.

Смежные вопросы