NHiberante 2列CustomType无效的SQL

时间:2017-07-02 18:11:23

标签: oracle nhibernate fluent-nhibernate nhibernate-mapping datetimeoffset

我试图将DateTimeOffset映射到Oracle类型“TIMESTAMP WITH TIME ZONE”但没有运气。

然后我决定编写一个使用两列的CustomType(第一个是UTC Date字段,另一个是TimeZone偏移,以分钟为单位)。生成的Oracle SQL是这样的:

select *
from TIME_EVENTS timeevent0_ 
where (
    timeevent0_.TIME_STAMP_UTC ge TIMESTAMP '2017-07-04 00:00:00.00' /* :p0 */ and
    timeevent0_.TIME_STAMP_TZ ge 0 /* :p1 */)
  • 我这里有两个问题
    • 为什么 ge 会生成> =。 ge不是有效的Oracle函数
    • 是否可以使用LINQ
   _unitOfWork.For<TimeEvent>().Where(x=>x.MyCustomDateWithOffset >= Date.Now()

在CustomType中指定SQL应该如下所示

select *
from TIME_EVENTS timeevent0_ 
where (
    timeevent0_.TIME_STAMP_UTC >= TIMESTAMP '2017-07-04 00:00:00.00' /* :p0 */ and
    timeevent0_.TIME_STAMP_TZ = 0 /* :p1 */)

我希望第二个参数相等(=),而不是更大或相等(&gt; =)。只是第一个参数应该是&gt; =。

会话工厂

case "ORACLE":
    return OracleClientConfiguration.Oracle10
        .AdoNetBatchSize(100)
        .ConnectionString(
            string.Format("User >Id= {0};Password={1};Data Source={2}",
                credentialStore.UserName, credentialStore.Password,?
                credentialStore.DataSource));

NHibernate版本:4.0.0.4000 流利版本:2.0.3.0

帮助表示感谢。关心西蒙

1 个答案:

答案 0 :(得分:0)

您应该使用单列自定义类型。对于多列类型,仅支持equals并且可以产生一致的结果。不支持其他比较:两列代表相同的值,在两列中应用>在大多数情况下只是非敏感。 NHibernate无法知道如何以有意义的方式进行这样的比较,因此不支持它。

关于使用单列自定义类型,它应该在.Net DateTimeOffset和Oracle OracleTimeStampTZ之间进行转换。 Oracle数据提供程序似乎只支持该特定类型。见this question。 OP表示他已成功做到这一点,但不幸的是他没有分享他的代码。

关于第二个问题,请不要问多个问题。但是,我不认为你的多列自定义类型是可行的。这只是具体的。