【问题标题】:The data types time and datetime are incompatible in the greater than operator数据类型 time 和 datetime 在大于运算符中不兼容
【发布时间】:2012-04-27 22:51:09
【问题描述】:

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

当我运行将 .NET TimeSpan 与 sql Time 字段进行比较的查询时,它会引发以下异常:

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

这是一个示例查询:

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

这是我的消息类 sn-p:

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");
    }
}

我已经到处搜索并尝试了我能找到或想到的一切。也许我只是错过了一些明显的东西?感谢您的帮助。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    事实证明,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();
    

    【讨论】:

    • 将近 9 年后,这也是我的问题的解决方案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多