数据类型时间和日期时间在大于运算符中不兼容

时间:2012-04-27 22:51:10

标签: nhibernate fluent-nhibernate

我正在使用Fluent NHibernate(1.3.0.727)的最新NuGet包,但我仍然遇到一个我认为在NHibernate 3.2中修复的问题(最新的Fluent使用NHib 3.3)。该数据库是Azure上的SQL Server 2008。

当我运行一个将.NET TimeSpan 与sql 时间字段进行比较的查询时,会抛出以下异常:

  

数据类型时间和日期时间与大于运算符不兼容。

以下是一个示例查询:

TimeSpan ts = new TimeSpan(1, 0, 0);
List<Message> messages = messageRepo.FilterBy(m => m.SendTime > ts).ToList();

这是我的Message class片段:

public class Message
{
    public virtual int Id { get; set; }

    [DataType(DataType.Time)]
    public virtual TimeSpan? SendTime { get; set; }}
}

这是相关的映射细节:

public class MessageMap : ClassMap<Message>
{
    public MessageMap()
    {
        Table("Message");
        LazyLoad();
        Id(x => x.Id).GeneratedBy.Identity().Column("MessageID");
        Map(x => x.SendTime).Column("SendTime").CustomType("TimeAsTimeSpan");
    }
}

我已经搜遍了所有我能找到或想到的东西。也许我只是错过了一些明显的东西?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

事实证明,Fluent的MsSql2008配置正在将NHibernate数据库驱动程序设置为不能正确处理TimeAsTimeSpan的驱动程序。手动将驱动程序设置为Sql2008ClientDriver可以解决此问题。见下文第4行:

var rawConfig = Fluently.Configure()
    .Database(
        MsSqlConfiguration.MsSql2008.ConnectionString(x => x.FromConnectionStringWithKey("ConnectionString"))
            .Driver("NHibernate.Driver.Sql2008ClientDriver")
    )
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SiteUserMap>())
    .BuildConfiguration();

答案 1 :(得分:0)

TimeSpan可以持续几天,因此它与DateTime兼容,而不是Time。时间仅包含一天中的时间。所以我认为你不应该为你的属性使用DataType属性 - 至少不是DataType.Time。