Sql server NHibernate和SQL Server datetime2,同时支持SQL Server和Oracle
我们有一个使用NHibernate作为ORM的项目。该项目设计用于SQL Server和Oracle(取决于安装产品的公司的选择)我们需要同时支持SQL Server和Oracle 在某些情况下,我们需要以毫秒为单位保存日期时间字段,因此在Oracle上,列类型为Sql server NHibernate和SQL Server datetime2,同时支持SQL Server和Oracle,sql-server,oracle,nhibernate,nhibernate-mapping,Sql Server,Oracle,Nhibernate,Nhibernate Mapping,我们有一个使用NHibernate作为ORM的项目。该项目设计用于SQL Server和Oracle(取决于安装产品的公司的选择)我们需要同时支持SQL Server和Oracle 在某些情况下,我们需要以毫秒为单位保存日期时间字段,因此在Oracle上,列类型为Date,在SQL Server上,我们使用datetime2 这是一个hbm示例: <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHiberna
Date
,在SQL Server上,我们使用datetime2
这是一个hbm示例:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDatetimeTest" namespace="NHibernateDatetimeTest">
<class name="User" table="Users">
<id name="UserId" column="ID" type="int">
</id>
<property name="Name" column="NAME" />
<property name="RegistratrionDate" column="RegDate" />
</class>
</hibernate-mapping>
从数据库中选择时,所有日期都按其应有的方式显示
但是,当我向SQL Server插入新数据时,保存的日期没有毫秒。但是,如果我更改hbm并指定类型,它在SQL Server上可以正常工作:
<property name="RegistratrionDate" column="RegDate" type="datetime2" />
问题是Oracle不知道datetime2是什么,并抛出一个异常
有没有办法既支持这两种平台,又能让SQL Server节省毫秒数?对于NHibernate 4.x或更早版本,您需要使用一个自定义类型,该类型依赖于根据目标数据库更改的一些特殊设置,以处理Oracle
时间戳
和SQL Server日期时间2
之间的切换
几天前发布的NHibernate 5.0已经完全改变了它的日期-时间处理方式,现在将使用默认的NHibernateDateTimeType
(顺便说一句,它不再减少小数秒)自动为您实现这一点
因此,在映射中,只需停止为日期时间属性指定任何类型:它从实体属性.Net类型的推断就足够了
有关更多详细信息,请参阅,这些更改在(长)可能的中断更改部分中突出显示
- NHibernate类型DateTimeType是.Net DateTime的默认值,不再减少小数秒数。如果希望剪切分数秒,请使用DateTimeNoMsType。它也适用于其本地/Utc对应方
- SQL Server 2008+方言现在对所有日期时间类型(包括时间戳)使用datetime2而不是datetime。这可以使用sql\u类型还原。保留\u日期时间设置
对于NHibernate 4.x或更早版本,您需要使用一个自定义类型,该类型依赖于根据目标数据库更改的特定设置,以处理Oracle
timestamp
和SQL Serverdatetime2
之间的切换
几天前发布的NHibernate 5.0已经完全改变了它的日期-时间处理方式,现在将使用默认的NHibernateDateTimeType
(顺便说一句,它不再减少小数秒)自动为您实现这一点
因此,在映射中,只需停止为日期时间属性指定任何类型:它从实体属性.Net类型的推断就足够了
有关更多详细信息,请参阅,这些更改在(长)可能的中断更改部分中突出显示
- NHibernate类型DateTimeType是.Net DateTime的默认值,不再减少小数秒数。如果希望剪切分数秒,请使用DateTimeNoMsType。它也适用于其本地/Utc对应方
- SQL Server 2008+方言现在对所有日期时间类型(包括时间戳)使用datetime2而不是datetime。这可以使用sql\u类型还原。保留\u日期时间设置
Oracle日期的精度仅为秒。要获得更高的精度,您需要使用时间戳数据类型。@Husqvik-对不起,这不是我的问题。我需要支持SQL Server的datetime2,但没有在hbm中明确指定datetime2类型。您使用的是哪个版本的NHibernate?你能转到代码映射吗?如果可以,您可以将映射拆分为单独的程序集,并为环境加载正确的映射(Oracle vs.SqlServer)@Fran我们使用的是版本4。代码中的映射不是一个选项。hbm有条件映射吗?对hbm做同样的映射怎么样?创建2个程序集,将hbm复制到两个项目中。进行特定于数据库的更改。有关如何在不同程序集中配置映射的信息,请参阅本文()。Oracle DATE的精度仅为秒。要获得更高的精度,您需要使用时间戳数据类型。@Husqvik-抱歉,这不是我的问题。我需要支持SQL Server的datetime2,但没有在hbm中明确指定datetime2类型。您使用的是哪个版本的NHibernate?你能转到代码映射吗?如果可以,您可以将映射拆分为单独的程序集,并为环境加载正确的映射(Oracle vs.SqlServer)@Fran我们使用的是版本4。代码中的映射不是一个选项。hbm有条件映射吗?对hbm做同样的映射怎么样?创建2个程序集,将hbm复制到两个项目中。进行特定于数据库的更改。有关如何在不同程序集中配置映射,请参阅本文()。