问题描述
||
我有一个数据库表(无法更改),该表将日期和时间存储在单独的字段中,但是我的班级只有一个DateTime属性(已打开)。
DateOpened 2011-05-10 00:00:00.000
TimeOpened 1899-12-30 09:53:00.000
在sql中我可以做
SELECT DateOpened + TimeOpened AS \'Opened\'
如何在Fluent NHibernate中对此进行映射?我正在使用Fluent Mapping。
我试过了
Map(x => x.Opened).Columns.Add(new string[] { \"DateOpened\",\"TimeOpened\" });
但我收到以下错误
property mapping has wrong number of columns: CBS.Tigerpaw.Data.ServiceOrder.Opened type: DateTime
解决方法
如果IUsertype是一个选项
public class DateTimeUserType : ImmutableUserType
{
public override object NullSafeGet(IDataReader rs,string[] names,object owner)
{
var date = (DateTime)NHibernateUtil.DateTime.NullSafeGet(rs,names[0]);
var time = (DateTime)NHibernateUtil.DateTime.NullSafeGet(rs,names[0]);
return new DateTime(date.Year,...,time.Hours,...);
}
public override void NullSafeSet(IDbCommand cmd,object value,int index)
{
DateTime dt = (DateTime)(value ?? DateTime.MinValue);
NHibernateUtil.DateTime.NullSafeSet(cmd,dt.Date,index);
NHibernateUtil.DateTime.NullSafeSet(cmd,new DateTime(1899,12,30,dt.Hours,dt.Minutes,dt.Seconds),index + 1);
}
public override Type ReturnedType
{
get { return typeof(DateTime); }
}
public override SqlType[] SqlTypes
{
get { return new[] { SqlTypeFactory.DateTime,SqlTypeFactory.DateTime }; }
}
}
Map(x => x.Opened)
.Columns.Add(\"DateOpened\",\"TimeOpened\")
.CustomType<DateTimeUserType>();
, 您可以使用班级中带有私有设置器的.Map(...).Formula(...)
和其他属性来定义DateOpened + TimeOpened
。
, 您可以考虑独立地映射两个单独的列,然后让您的类提供一个附加的(且未映射的)\“ Opened \”属性来集成其值。遗憾的是,这两个映射属性仍然可以作为公共属性看到,因为Fluent NHibernate要求这样做,以便映射类中的lambda表达式可以使用它们。