然后,我使用 Fluent NHibernate 及其自动映射功能来映射以下简化的 POCO 类:
public class Foo
{
public virtual int Id { get; set; }
public virtual datetime CreatedDateTime { get; set; }
}
默认情况下,CreatedDateTime 字段将映射到 SQL DateTime。但是,如果我进行测试来检查实体是否正确创建,则会失败。这是因为 DateTime 字段的精度不会一直保持到 SQL 数据库。我理解这背后的原因是 MS SQL Server DateTime 只能通过四舍五入到 0.000、0.003 或 0.007 的增量来保持毫秒精度(请参阅http://msdn.microsoft.com/en-us/library/ms187819.aspx http://msdn.microsoft.com/en-us/library/ms187819.aspx)。因此,NHibernate 在保存到存储时会截断毫秒。这导致我的测试在检查字段是否正确保留时失败,因为我的 .NET DateTime 保留其毫秒,但保存后检索的 DateTime 丢失了其毫秒,因此两者并不真正相等。
为了解决这个问题,我向 Foo 对象添加了以下映射:
public class FooMap : IAutoMappingOverride<Foo>
{
public void Override(AutoMapping<Foo> mapping)
{
mapping.Map(f => f.CreatedDateTime).CustomType("datetime2");
}
}
据我了解,这种映射使 NHibernate 将 CreatedDateTime 持久保存为 SQL 类型的 datetime2,它可以存储 .NET DateTime 可以存储的完整精度。
这很有效,测试现在通过了。
然而,一次通过后又会失败:我检查架构导出的测试现在失败并出现以下错误:
System.ArgumentException : Dialect does not support DbType.DateTime2
Parameter name: typecode
堆栈跟踪为:
at NHibernate.Dialect.TypeNames.Get(DbType typecode)
at NHibernate.Dialect.Dialect.GetTypeName(SqlType sqlType)
at NHibernate.Mapping.Column.GetDialectTypeName(Dialect dialect, IMapping mapping)
at NHibernate.Mapping.Table.SqlCreateString(Dialect dialect, IMapping p, String defaultCatalog, String defaultSchema)
at NHibernate.Cfg.Configuration.GenerateSchemaCreationScript(Dialect dialect)
at NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg, IDictionary`2 configProperties)
at NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg)
该代码使用 NHibernate.Tool.hbm2ddl.SchemaExport 对象来调用 Execute 方法。
我正在使用 Fluent v1 和 NHibernate v2.1。
我也尝试过绘制我的DateTime
到时间戳,但甚至无法使映射工作,因为插入失败,说明:
无法将显式值插入时间戳列。使用INSERT
使用列列表来排除时间戳列,或插入DEFAULT
进入时间戳列。
有谁知道如何让SchemeExport与a一起工作datetime2
或者如何让时间戳映射适用于datetime
财产?