如何在Sql Server 2008/2012中为时间创建NHibernate IUserType?

问题描述 投票:5回答:1

我正在尝试为Noda Time IUserType类型创建NHibernate LocalTime,该类型将在逻辑上映射到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.

我的用户类型中的相关代码是:

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 Profiler):

exec sp_executesql N'select [...] from [SchedulingTemplate] scheduling0_ where scheduling0_.Start<@p0 and scheduling0_.[End]>=@p1',N'@p0 datetime,@p1 datetime',@p0='1753-01-01 20:00:00',@p1='1753-01-01 06:00:00'

((为简洁起见,我省略了选择列表)

注意,参数的类型和值被视为datetime

这似乎与已关闭的https://nhibernate.jira.com/browse/NH-2661https://nhibernate.jira.com/browse/NH-2660的两个NH错误非常相似。

我尝试使用NHibernateUtil.TimeAsTimeSpan,但似乎也没有用。它生成的查询完全相同,这令我感到惊讶。我想也许NH-2661中描述的问题对于用户类型也存在,并且尚未针对该问题解决?

我正在使用NHibernate v3.3.1.400和Noda Time 1.0.0-beta2

nhibernate nodatime
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.