gpt4 book ai didi

nhibernate - 在 NHibernate 中使用 OffsetDateTime

转载 作者:行者123 更新时间:2023-12-01 10:36:32 24 4
gpt4 key购买 nike

我正在尝试映射 NodaTime 的 OffsetDateTime键入 SQL Server 但我不确定如何解决 NodaTime 的 OffsetDateTime 之间的阻抗和 SQL Server 的 DateTimeOffset类型。

我遇到的主要问题是让 LINQ 支持正常工作,因为 OffsetDateTime没有比较运算符,例如 < .这些系统在如何处理平等方面也有所不同。 NodaTime 既考虑了时间点又考虑了偏移量,而 SQL Server 只考虑时间点。

2015-12-24 11:18+01:002015-12-24 10:18+00:00在 SQL Server 中被认为是相等的,但在 NodaTime 中不相等。

我考虑过使用 ICompositeUserType将 UTC 日期/时间和偏移量存储在单独的列中(类似于 SQL Server 2008 之前)但是 OffsetDateTime没有 UTC/Instant 属性。因此,我看不到如何获得 date.ToInstant()在 LINQ 查询中正确映射到 ICompositeUserType 中的属性.

最佳答案

OffsetDateTime 应映射到 SQL Server datetimeoffset。 NHibernate 通过 IUserType 支持自定义类型映射 as described in this article对于完成这项工作至关重要。

虽然OffsetDateTime 没有直接实现IComparable,但您可以使用OffsetDateTime.Comparer.Instant 来比较它们。这在 LINQ 查询中可能仍然难以使用,但这是探索的一种途径。

有人可能应该编写一个 NHibernate-NodaTime 集成包来简化这个过程。考虑到我之前为 RavenDB 做过这个和 Dapper ,我会考虑的。 :)

抱歉,我没有更好的实际“做这个”类型的答案给你。


更新

我开始着手解决这个问题,并成功地为 OffsetDateTime 构建了一个 IUserType,但它不适用于比较运算符 - 正是因为您描述的原因。我相信解决方案涉及扩展 linq 提供程序,类似于描述的技术 in this blog post .我还没有完整的工作示例,但我会在有的时候在这里更新。

最终,您将无法编写:

session.Query<Foo>().Where(x => x.SomeODT > value)

因为 OffsetDateTime 没有比较运算符,所以它不会编译。

相反,应该扩展 LINQ 提供程序以支持如下内容:

session.Query<Foo>().Where(x => OffsetDateTime.Comparer.Instant.Compare(x.SomeODT, value) > 0)

或者更明确地说:

session.Query<Foo>().Where(x => x.SomeODT.ToInstant() > value.ToInstant())

或者两者兼而有之。两者都可以编译,但会在没有 LINQ 提供程序适当支持的情况下抛出异常。


第二次更新

有人打败了我。 NHibernate 现在有一组扩展来支持 Noda Time 数据类型 in this project . :)

关于nhibernate - 在 NHibernate 中使用 OffsetDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34452792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com