2010-02-22 44 views

回答

3

您可以使用IUserType來映射列。

<class name="UnsignedCounter"> 
    <property name="Count" type="mynamespace.UInt32Type, mydll" /> 
</class> 

和映射UInt32?UInt32的IUserType。

class UInt32Type : IUserType 
{ 
    public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner) 
    { 
     int? i = (int?) NHibernateUtil.Int32.NullSafeGet(rs, names[0]); 
     return (UInt32?) i; 
    } 

    public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index) 
    { 
     UInt32? u = (UInt32?) value; 
     int? i = (Int32?) u; 
     NHibernateUtil.Int32.NullSafeSet(cmd, i, index); 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(Nullable<UInt32>); } 
    } 

    public SqlType[] SqlTypes 
    { 
     get { return new SqlType[] { SqlTypeFactory.Int32 }; } 
    } 

    public object Assemble(object cached, object owner) 
    { 
     return cached; 
    } 

    public object DeepCopy(object value) 
    { 
     return value; 
    } 

    public object Disassemble(object value) 
    { 
     return value; 
    } 

    public int GetHashCode(object x) 
    { 
     return x.GetHashCode(); 
    } 

    public bool IsMutable 
    { 
     get { return false; } 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public new bool Equals(object x, object y) 
    { 
     return x != null && x.Equals(y); 
    } 
} 
+0

使用'NullSafeSet'從uint Enum類型轉換時出現問題:在這種情況下,無法將值轉換爲可爲null的類型。使用'uint? u = null;如果(值!= null)u =(uint)值;'而不是 – fmuecke 2013-07-02 16:28:17

+0

也等於不正確的工作。如果(object.ReferenceEquals(x,y)) { }返回true,則工作版本可以是「public new bool Equals(object x,object y) { } if(x == null || y == null) { return false; } return(uint)x ==(uint)y; }' – fmuecke 2013-07-03 07:05:12

+0

@fmuecke:在這種情況下,'Equals'將始終接收盒裝值,因此'object.ReferenceEquals'將始終返回false,並且它們永遠不會爲空。 – Groo 2014-10-31 10:28:04

2

我晚了一年,但因爲我有同樣的問題,發現了不同的答案,我想我會添加它。這似乎更簡單。也許它有一個我還沒有發現的缺陷。

我使用NHibernate 3.0,Visual Studio 2005和.NET 2.0.x.

我發現我可以使用.NET的UInt32類,而不是在hbm.xml中包含type屬性。

// .NET 2.0 Property syntax 
public class MyClass 
{ 
    // NHibernate needs public virtual properties. 
    private UInt32 _Id; 
    public virtual UInt32 Id { get { return (_Id); } set { _Id = value; } } 
} 


// hbml.xml 
<class name ="MyClass"> 
    <id name="Id" /> 
</class> 


// SQL to create the table 
CREATE TABLE `PumpConnection` (
`Id` **INT**(10) **UNSIGNED** NOT NULL AUTO_INCREMENT, 
) 
+0

您是否嘗試過使用'sql-type'來使用模式生成? – 2012-07-18 05:12:25

相關問題