然后我使用 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 只能通过四舍五入到 .000、.003 或 .007 的增量来保持毫秒精度(请参阅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 持久化为 datetime2 的 SQL 类型,它可以存储 .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。
我也尝试将 my 映射DateTime
到 TimeStamp 但由于插入失败,甚至无法使映射正常工作:
无法将显式值插入时间戳列。与列列表一起使用INSERT
以排除时间戳列,或将 aDEFAULT
插入时间戳列。
有谁知道如何让 SchemeExport 与 a 一起使用datetime2
或如何让时间戳映射为datetime
属性工作?