流利的NHibernate将“日期和时间”字段合并为DateTime对象

问题描述

|| 我有一个数据库表(无法更改),该表将日期和时间存储在单独的字段中,但是我的班级只有一个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表达式可以使用它们。