流体NHibernate,自定义类型和Id映射

时间:2012-12-15 02:27:25

标签: fluent-nhibernate fluent-nhibernate-mapping

我在C#中有一个对象,我想用作数据库中的主键,在添加新对象时自动递增。该对象基本上是一个ulong值的包装器,它使用该值的一些位来获得额外的提示。我想将它存储为数据库中的“纯”ulong值,但是当从DB加载/卸载值时,我想获得自动转换。 IE,根据它们来自的表格将'提示'位应用于该值。

我根据我在网上找到的一些例子(在这个论坛上提供了大量的帮助)开始实现我自己的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();
}

此时我在配置中得到一个异常,Id只能是一个整数。我想这是有道理的,但我有一半期望实现自定义类型,原生ulong数据库类型将接管和工作。

我试图沿着创建自定义生成器的道路前进,但它仍然有点超出我的技能水平,所以我虽然磕磕绊绊。

我的问题是,我是否有可能完成我要对映射做的事情?

1 个答案:

答案 0 :(得分: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受到保护。