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