3

当我从检查表映射列时,我这样做:

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

如何使用公式的 sql 查询检索到的数据使属性映射初始化 UserType?

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

失败,出现异常“列数错误”。

提前致谢!

4

2 回答 2

1

我是迈克尔引用的文章的作者。我不知道人们仍然感兴趣,我不确定它是否适用于最新的 NHibernate。这是一个新的链接:http: //thoughtspam.wordpress.com/2007/12/19/nhibernate-property-with-formula/

例如,使用北风...

映射:

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

于 2013-02-26T17:35:30.740 回答
1

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

于 2009-11-27T13:20:31.520 回答