gpt4 book ai didi

nHibernate 映射到自定义类型

转载 作者:行者123 更新时间:2023-12-03 23:34:45 25 4
gpt4 key购买 nike

我有一个 Oracle 数据库,其中一个字段是日期范围字段。它基本上只是作为 VARCHAR(40) 以 YYYY/MM/DD-YYYY/MM/DD 格式存储在数据库中。我想在 nHibernate 中将它映射到我这样创建的自定义类

public class DateTimeRange
{
public DateTimeRange(DateTime fromTime, DateTime toTime)
{
FromTime = fromTime;
ToTime = toTime;
}

public override string ToString()
{
return String.Format("{0} to {1}", FromTime.ToString("HH:mm:ss"), ToTime.ToString("HH:mm:ss"));
}

public DateTime FromTime { get; set; }

public DateTime ToTime { get; set; }
}

如何映射到这样的自定义类?

最佳答案

您需要实现自己的 IUserType。

看到这个blog post详情。如果博客消失,我还将粘贴下面的相关部分。

在 NHibernate 中,自定义映射类型是派生自 IUserType 或 ICompositeUserType 接口(interface)的类。这些接口(interface)包含几个必须实现的方法,但出于我们的目的,我们将重点关注其中的两个。考虑以下。

  public class TypeClassUserType : IUserType
{


object IUserType.NullSafeGet(IDataReader rs,
string[] names,
object owner) {

string name = NHibernateUtil.String.NullSafeGet(rs,
names[0]) as string;

TypeClassFactory factory = new TypeClassFactory();
TypeClass typeobj = factory.GetTypeClass(name);
return typeobj;
}

void IUserType.NullSafeSet(IDbCommand cmd,
object value,
int index) {

string name = ((TypeClass)value).Name;
NHibernateUtil.String.NullSafeSet(cmd, name, index);
}
}

创建了这个类后,我现在可以将 ActualClass 和 TypeClass 之间的关联显式映射为 ActualClass 映射上的一个简单属性。
<property
name="Type"
column="TypeName"
type="Samples.NHibernate.DataAccess.TypeClassUserType,
Samples.NHibernate.DataAccess" />

由于 NHibernate 正在保存一个 ActualType 的实例,它会加载并创建一个新的 TypeClassUserType 实例并调用 NullSafeSet 方法。从方法体中可以看出,我只是从映射属性中提取名称(作为 value 参数传入)并将提取的名称设置为要在数据库中设置的参数的值。最终结果是,尽管 ActualClass 的 Type 属性是域模型中的 TypeClass,但只有 TypeClass 对象的 Name 属性被存储在数据库中。反之亦然。当 NHibernate 从数据库加载 ActualType 的实例并找到我的自定义映射类型的属性时,它会加载我的自定义类型并调用 NullSafeGet 方法。如您所见,我的方法从返回的数据中获取名称,调用我的享元工厂以获取正确的 TypeClass 实例,然后实际返回该实例。类型解析过程对我的数据访问类是透明的(甚至对 NHibernate 本身也是如此)。

关于nHibernate 映射到自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/242022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com