Fluent nhibernate 流体NHibernate、自定义类型和Id映射

Fluent nhibernate 流体NHibernate、自定义类型和Id映射,fluent-nhibernate,fluent-nhibernate-mapping,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一个C#中的对象,我想在添加新对象时自动递增的数据库中用作主键。该对象基本上是一个ulong值的包装器,它使用该值的一些位作为附加提示。我想将其作为“纯”ulong值存储在数据库中,但我想在从数据库加载/卸载该值时自动进行转换。即,根据它们来自的表将“提示”位应用于值 我根据在网上找到的大量示例(本论坛提供了大量帮助),开始了实现自己的IUserType对象的旅程 我有一个ObjectId类,它的作用是一个对象ID class ObjectIdType: IUserType { pr

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

我根据在网上找到的大量示例(本论坛提供了大量帮助),开始了实现自己的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();
}
公共类ObjectTableMap()
{ 
Id(x=>x.Id)
.列(“实例id”)
.CustomType()
.GeneratedBy.Native();
}
此时,我在配置中得到一个异常,Id只能是整数。我想这是有道理的,但我有一半的期望是实现了自定义类型,本机ulong数据库类型将接管并工作

我曾尝试创建一个自定义生成器,但它仍然有点超出我的技能水平,所以我在这方面遇到了障碍


我的问题是,我是否有可能完成我试图用映射做的事情?

我认为,这是不可能的,因为映射使用本机生成器作为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受到保护