我在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数据库类型将接管和工作。
我试图沿着创建自定义生成器的道路前进,但它仍然有点超出我的技能水平,所以我虽然磕磕绊绊。
我的问题是,我是否有可能完成我要对映射做的事情?
答案 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受到保护。