0

我在 C# 中有一个对象,我想将其用作数据库中的主键,当添加新对象时它会自动递增。该对象基本上是一个 ulong 值的包装器,它使用该值的一些位作为附加提示。我想将它作为“纯”ulong 值存储在数据库中,但我想在从数据库加载/卸载值时获得自动转换。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 数据库类型将接管并工作。

我试图走上创建自定义生成器的道路,但它仍然有点超出我的技能水平,所以我遇到了挫折。

我的问题是,我是否可以通过映射完成我想要做的事情?

4

1 回答 1

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 受保护。

于 2012-12-22T14:11:46.520 回答