NHibernate 中的 DateTime 精度以及 NHibernate SchemeExport 中对 DateTime2 的支持

2024-03-31

然后,我使用 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财产?


实际上,NHibernate 参考指出 DateTime nhibernate 类型会将 .NET DateTime 存储为在秒级截断的 SQL 日期时间(无毫秒粒度)

因此它提供了TimestampNHibernate 类型 (type="Timestamp"在映射中),它将存储一个 .NETDateTime作为 SQLdatetime没有截断。注意这里有一个SQLtimestamp数据类型是not需要,并且如果你有多个的话实际上会破坏timestamp一个表中的列。因此,区分两者之间的差异非常重要sql-type and typeNHibernate 映射中的属性。

另外,请注意,如果您正在使用过滤器,则相同的规则适用于过滤器定义:如果您指定DateTime参数,参数的值将被截断,不带毫秒。

查看第 5.2.2 章。基本值类型 http://nhibernate.info/doc/nhibernate-reference/mapping.html, 表 5.3 System.ValueType 映射类型 http://nhforge.org/doc/nh/en/index.html#d0e4668.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 中的 DateTime 精度以及 NHibernate SchemeExport 中对 DateTime2 的支持 的相关文章

随机推荐