我有一个数据库表(我无法更改),它将日期和时间存储在单独的字段中,但我的类只有一个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
答案 0 :(得分:2)
如果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>();
答案 1 :(得分:1)
您可以使用DateOpened + TimeOpened
&amp;来定义.Map(...).Formula(...)
。您班级中有私人二手的额外财产。
答案 2 :(得分:0)
您可以考虑单独映射两个单独的列,然后让您的类提供一个额外的(和未映射的)“Opened”属性,以集成它们的值。遗憾的是,两个映射的属性仍然可以作为公共属性显示,因为Fluent NHibernate需要这样,以便映射类中的lambda表达式可以得到它们。