2009-11-26 129 views
3

當我映射從檢查表列,我這樣做:NHibernate的屬性映射:列式

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

我怎樣才能使屬性映射初始化與公式的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/

例如,使用羅斯文...

映射:

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