Отображение свойств NHibernate: столбцы и формула - PullRequest
3 голосов
/ 26 ноября 2009

Когда я сопоставляю столбцы из проверенной таблицы, я делаю это:

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

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

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

терпит неудачу с исключением "неправильное количество столбцов".

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

Ответы [ 2 ]

1 голос
/ 26 февраля 2013

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

пример с использованием Northwind ...

Отображение:

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

1 голос
/ 27 ноября 2009

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

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

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

...