我正在嘗試爲Noda Time LocalTime
類型創建一個NHibernate IUserType
,該類型在邏輯上映射到Sql Server 2008/2012中的time
類型。我能夠從數據庫中保存和加載值。但是,我不能寫涉及本地時間比較查詢,如_session.Query<SchedulingTemplate>().Where(x => x.Start < end && x.End >= start)
給出了錯誤SqlException (0x80131904): The data types time and datetime are incompatible in the less than operator.
如何在Sql Server 2008/2012中創建一個NHibnerate IUserType?
從我的用戶類型的相關代碼:
public Type ReturnedType
{
get { return typeof(LocalTime); }
}
public override object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var dbValue = NHibernateUtil.Time.NullSafeGet(rs, names);
if(dbValue == null)
return null;
return LocalDateTime.FromDateTime((DateTime)dbValue).TimeOfDay;
}
public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
if(value == null)
NHibernateUtil.Time.NullSafeSet(cmd, null, index);
else
NHibernateUtil.Time.NullSafeSet(cmd, ((LocalTime)value).LocalDateTime.ToDateTimeUnspecified(), index);
}
public override SqlType[] SqlTypes
{
get { return new[] { SqlTypeFactory.Time }; }
}
的問題是,儘管上面的代碼表明數據庫類型是時間,它生成下面的查詢(每個SQL探查):
exec sp_executesql N'select [...] from [SchedulingTemplate] scheduling0_ where scheduling0_.Start<@p0 and scheduling0_.[End]>[email protected]',N'@p0 datetime,@p1 datetime',@p0='1753-01-01 20:00:00',@p1='1753-01-01 06:00:00'
(注意我爲簡潔起見省略了選擇列表)
請注意,參數的類型和值被視爲datetime
。
這似乎與兩個已關閉的NH錯誤https://nhibernate.jira.com/browse/NH-2661和https://nhibernate.jira.com/browse/NH-2660非常相似。
我試圖使用NHibernateUtil.TimeAsTimeSpan
,那似乎也沒有工作。它生成完全相同的查詢,讓我感到驚訝。我想也許NH-2661中描述的問題也存在於用戶類型中,並且不是固定的?
我使用NHibernate v3.3.1.400和野田時間1.0.0-β2
在解決這個問題之前,您必須實現您自己的SqlType。複製TimeType中的代碼並修復它。 – Firo