流畅的NHibernate将日期和时间字段组合到DateTime对象中

时间:2011-05-27 18:25:44

标签: fluent-nhibernate

我有一个数据库表(我无法更改),它将日期和时间存储在单独的字段中,但我的类只有一个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

3 个答案:

答案 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表达式可以得到它们。