日期列不会保留 1753 年之前的日期

Date column not being persisted for dates before the year 1753

我正在尝试使用 NHibernate 保留实体,但我的 DateTime? 属性 没有保留 1753 年之前的日期。我知道这是 DATETIME 的下限,但在这种情况下,我的 属性 由 DATE 列支持,根据 the docs 能够处理 0001-01-019999-12-31.

如果我尝试坚持 1752 年 1 月 1 日,NHibernate 会为 DateOfBirth 列插入一个 NULL

这发生在一个更大的项目中,但我花时间创建了一个像这样的小复现:

并看到测试失败,因为 DateOfBirth 实际上是 null

我已经使用调试器仔细检查 DateOfBirth 实际上在保存之前设置为正确的值。

我仔细检查了生成的列实际上是 Date,并检查了 the docs 这种类型的范围是否足够大;

我还检查了其他属性 是否 被持久化:参见 NUnit 测试,它断言 Name 属性 的持久性。

我已经通过NuGet添加了log4net并配置了NHibernate输出格式为SQL,如下:

INSERT INTO Person (Name, DateOfBirth) 
VALUES (@p0, @p1);
select SCOPE_IDENTITY();
-- @p0 = 'John' [Type: String (4000)],
-- @p1 = NULL [Type: DateTime (0)]

所以实际上 NHibernate 似乎给我带来了麻烦:它明确地插入了 NULL。我已经通过使用 SSMS 手动插入一行来仔细检查了这一点,它确实接受 '16000101' 作为值。

最后,我用 new DateTime(1900, 1, 1) 重新 运行 测试,结果一直很好。

底线:如何让 NHibernate 保留 1753 年之前的日期?

我的问题与 this one, just about a duplicate I guess. In any case, the answer there by @JimFennel 非常相似,对我来说也是一个解决方案。将我的 属性 映射更改为此...

<property name="DateOfBirth" type="DateTime2">
  <column name="DateOfBirth" sql-type="date" />
</property>

...也解决了我的特殊问题。