NHibernate和SQL Server datetime2并支持SQL Server和Oracle

时间:2015-09-20 12:41:11

标签: sql-server oracle nhibernate nhibernate-mapping

我们有一个使用NHibernate作为ORM的项目。该项目旨在适用于SQL Server和Oracle(取决于安装产品的公司的选择)。 我们需要同时支持SQL Server和Oracle

在某些情况下,我们需要使用毫秒保存DateTime字段,因此在Oracle上列类型为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节省毫秒?

1 个答案:

答案 0 :(得分:0)

使用NHibernate 4.x或更早版本,您需要使用依赖于根据目标数据库更改的某些临时设置的自定义类型来处理Oracle timestamp和SQL Server datetime2之间的切换

几天前发布的NHibernate 5.0已经完全改变了它的日期时间处理,并且现在将使用默认的NHibernate DateTimeType自动执行此操作(顺便说一下,它不会减少小数秒)。

因此,在您的映射中,只需停止为日期时间属性指定任何类型:来自实体属性.Net类型的推断应该足够了。

有关详细信息,请参阅其release notes,这些更改会在(长)可能的重大更改部分中突出显示。

  
      
  • NHibernate类型DateTimeType,它是.Net DateTime的默认值,不再缩短小数秒。如果您希望切割小数秒,请使用DateTimeNoMsType。它也适用于Local / Utc对应物。
  •   

...

  
      
  • SQL Server 2008+方言现在对所有日期时间类型使用datetime2而不是datetime,包括时间戳。这可以使用sql_types.keep_datetime设置恢复。
  •