2012-12-15 80 views
0

我有一個C#中的對象,我想用作數據庫中的主鍵,在添加新對象時自動遞增。該對象基本上是一個ulong值的包裝,它使用值的某些位作爲附加提示。我想將它存儲爲數據庫中的「純粹」ulong值,但我希望在從數據庫加載/卸載值時獲得自動轉換。 IE,將「提示」位應用於基於它們來自的表的值。流體NHibernate,自定義類型和Id映射

根據我在網上找到的例子數量(本論壇中的大量幫助),我開始實施自己的IUserType對象。

我有一個起作用的的ObjectId類是對象ID

class ObjectIdType: IUserType 
{ 
    private static readonly NHibernate.SqlTypes.SqlType[] SQL_TYPES = { NHibernateUtil.UInt64.SqlType }; 

    public NHibernate.SqlTypes.SqlType[] SqlTypes 
    { 
     get { return SQL_TYPES; } 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(ObjectId); } 
    } 

    ... 
} 

我有一個映射類,看起來像這樣:

public class ObjectTableMap() 
{ 
    Id(x => x.Id) 
    .Column("instance_id") 
      .CustomType<ObjectIdType>() 
      .GeneratedBy.Native(); 
} 

在這一點上,在配置我得到一個異常標識只能是一個整數。我想這是有道理的,但我有一半希望實現自定義類型,本地ulong數據庫類型將接管和工作。

我試過去創建一個自定義生成器的路徑,但它仍然有點超出我的技能水平,所以我絆倒了它。

我的問題是,是否有可能完成我正在嘗試使用映射?

回答

0

我想,這是不可能的,因爲你的映射使用Id的本地生成器。這隻能用於整型(和GUID)。您可以嘗試使用您的自定義類型分配的ID,因此您有責任將值分配給您的ID屬性。

還有另外一種選擇:爲什麼不在你的表上設置你的信息位,而取決於你的表?你的實體代表表格,所以你應該在實體類中擁有相同的信息。示例:

class Entity 
{ 
    protected virtual ulong InternalId { get; set; } // Mapped as Id 

    public virtual ulong Id       // This property is not mapped 
    { 
     get 
     { 
      var retVal = InternalId; 
      // Flip your hint bits here based on class information 
      return retVal; 
     } 
    } 
} 

您還可以將InternalId轉換爲公共屬性並使setter受保護。