Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server NHibernate和SQL Server datetime2,同时支持SQL Server和Oracle_Sql Server_Oracle_Nhibernate_Nhibernate Mapping - Fatal编程技术网

Sql server NHibernate和SQL Server datetime2,同时支持SQL Server和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

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

在某些情况下,我们需要以毫秒为单位保存日期时间字段,因此在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节省毫秒数?

对于NHibernate 4.x或更早版本,您需要使用一个自定义类型,该类型依赖于根据目标数据库更改的一些特殊设置,以处理Oracle
时间戳
和SQL Server
日期时间2
之间的切换

几天前发布的NHibernate 5.0已经完全改变了它的日期-时间处理方式,现在将使用默认的NHibernate
DateTimeType
(顺便说一句,它不再减少小数秒)自动为您实现这一点

因此,在映射中,只需停止为日期时间属性指定任何类型:它从实体属性.Net类型的推断就足够了

有关更多详细信息,请参阅,这些更改在(长)可能的中断更改部分中突出显示

  • NHibernate类型DateTimeType是.Net DateTime的默认值,不再减少小数秒数。如果希望剪切分数秒,请使用DateTimeNoMsType。它也适用于其本地/Utc对应方

  • SQL Server 2008+方言现在对所有日期时间类型(包括时间戳)使用datetime2而不是datetime。这可以使用sql\u类型还原。保留\u日期时间设置

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

几天前发布的NHibernate 5.0已经完全改变了它的日期-时间处理方式,现在将使用默认的NHibernate
DateTimeType
(顺便说一句,它不再减少小数秒)自动为您实现这一点

因此,在映射中,只需停止为日期时间属性指定任何类型:它从实体属性.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复制到两个项目中。进行特定于数据库的更改。有关如何在不同程序集中配置映射,请参阅本文()。