2011-05-27 76 views
2

我有一個數據庫表(我無法更改),它將日期和時間存儲在單獨的字段中,但我的類只有一個DateTime屬性(已打開)。流利的NHibernate將日期和時間字段組合到DateTime對象中

DateOpened 2011-05-10 00:00:00.000 
TimeOpened 1899-12-30 09:53:00.000 

在SQL我只是做

SELECT DateOpened + TimeOpened AS 'Opened' 

我怎麼能在功能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

你可能會考慮獨立映射兩個單獨的列,然後爲你的類提供了一個額外的(和未映射) 「開放」的財產,整合其價值。令人遺憾的是,這兩個映射的屬性仍然可以作爲公共屬性顯示,因爲Fluent NHibernate需要這樣做,以便映射類中的lambda表達式可以獲取它們。

+0

我想到這一點,但我手裏攥着另一種解決方案。這將是我最後的手段。 – modernzombie 2011-05-27 18:36:34

1

你可以通過使用.Map(...).Formula(...) &你的類中有一個私有setter的附加屬性來定義DateOpened + TimeOpened

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>(); 
相關問題