【问题标题】:NHibernate property mapping: columns and formulaNHibernate 属性映射:列和公式
【发布时间】:2023-03-26 09:52:01
【问题描述】:

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

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

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

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

因“列数错误”异常而失败。

提前致谢!

【问题讨论】:

    标签: nhibernate properties formula usertype


    【解决方案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

    【讨论】:

    • 感谢您的回答。我已经尝试过您在 post2 中提供的方式,但它什么也没给我。看起来 UserType 只是没有看到结果数据集的任何列:(
    • 这篇文章已经有一年多了。我不控制互联网。使用第一个反对票的方法!
    • 就是为什么答案应该包含所需的信息并链接到另一个站点作为“来源”,而不是仅仅链接到另一个站点。
    【解决方案2】:

    我是迈克尔引用的文章的作者。我不知道人们仍然感兴趣,我不确定它是否适用于最新的 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多