我正在使用Fluent NHibernate(1.3.0.727)的最新NuGet包,但我仍然遇到一个我认为在NHibernate 3.2中已修复的问题(最新的Fluent使用NHib 3.3)。该数据库是 Azure 上的 SQL Server 2008。
当我运行将 .NET TimeSpan 与 sql 时间字段进行比较的查询时,它会引发以下异常:
数据类型 time 和 datetime 在大于运算符中不兼容。
下面是一个示例查询:
TimeSpan ts = new TimeSpan(1, 0, 0);
List<Message> messages = messageRepo.FilterBy(m => m.SendTime > ts).ToList();
这是我的消息类代码段:
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");
}
}
我遍历了所有搜索,并尝试了我能找到或想到的一切。也许我只是错过了一些明显的东西?感谢您的帮助。
事实证明,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();
TimeSpan 可以容纳几天,因此它与 DateTime 兼容,而不是 Time。时间仅包含一天中的时间。所以我认为你不应该在你的属性中使用 DataType 属性 - 至少不应该 DataType.Time。