Próbuję utworzyć NHibernate IUserType
dla typu Noda Time LocalTime
, który logicznie mapowałby do typu time
w Sql Server 2008/2012. Jestem w stanie uzyskać zapisanie wartości i załadowanie z bazy danych. Jednak nie mogę pisać zapytań obejmujących porównanie czasów lokalnych jak _session.Query<SchedulingTemplate>().Where(x => x.Start < end && x.End >= start)
daje błąd SqlException (0x80131904): The data types time and datetime are incompatible in the less than operator.
Jak utworzyć typ IUserType NHibnerate dla czasu w Sql Server 2008/2012?
Odpowiedni kod z mojego typu użytkownika jest:
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 }; }
}
Problemem jest to, że pomimo powyższego kodu wskazując bazę typ to czas, generuje następujące zapytanie (za SQL Profiler):
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'
(nota pominąłem listy wyboru dla zwięzłość)
Należy zauważyć, że typ i wartość parametrów są traktowane jako datetime
.
Wygląda to bardzo podobnie do dwóch błędów NH, które zostały zamknięte https://nhibernate.jira.com/browse/NH-2661 i https://nhibernate.jira.com/browse/NH-2660.
Próbowałem użyć NHibernateUtil.TimeAsTimeSpan
i to też nie działa. Wygenerował dokładnie to samo zapytanie, które mnie zaskoczyło. Myślę, że może problem opisany w NH-2661 istnieje również dla typów użytkowników i nie został na to ustalony?
Używam NHibernate v3.3.1.400 i Noda Czas 1.0.0-beta2
dopóki to nie zostanie naprawione, musisz zaimplementować własny SqlType. Skopiuj kod z TimeType i napraw go. – Firo