让我们考虑一下 NHibernate 中的以下简单类:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyTests.Tests"
namespace="MyTests.Tests">
<class name="TestClass" table="TestTable" dynamic-update="true">
<id name="Id" column="Id" type="UInt64" unsaved-value="0">
<generator class="native" />
</id>
<property name="Date1" type="UtcDateTime"></property>
</class>
</hibernate-mapping>
该类定义如下。
public class TestClass {
virtual public UInt64 Id { get; set; }
virtual public DateTime? Date1 { get; set; }
}
以下用例在针对 MySql 和 SQLite 执行时会产生不同的结果。
[Test]
public void Test1() {
//Get Now without Milliseconds
DateTime now = DateTime.UtcNow;
now = new DateTime(now.Ticks - (now.Ticks % TimeSpan.TicksPerSecond), now.Kind);
TestClass tc1 = new TestClass() { Date1 = now };
using(ISession s = NewSession(c))
using(ITransaction tx = s.BeginTransaction()) {
s.Save(tc1);
tx.Commit();
}
using(ISession s = NewSession(c))
using(ITransaction tx = s.BeginTransaction()) {
TestClass tc2 = s.Load<TestClass>(tc1.Id);
Assert.IsNotNull(tc2);
Assert.AreEqual(DateTimeKind.Utc, tc1.Date1.Value.Kind, "Checking kinds of tc1");
Assert.AreEqual(tc1.Date1.Value.Kind, tc2.Date1.Value.Kind, "Comparing Kinds");
Assert.AreEqual(now, tc2.Date1, "Comparing datetime values");
}
}
当使用的数据库是 SQLite 时,最后一个断言失败。
当我查看 SQLite 文件时,我可以看到日期是正确的(UTC 值)。
当它被读回时,它是用 DateTimeKind.Utc 读取的,但是该值是本地时间。
如果我使用 MySql,则不会发生此问题。
SQLite 中的表由 NHibernate 使用 CreateSchema 创建,并由 SQLite 管理员报告为
CREATE TABLE TestTable (Id integer primary key autoincrement, Date1 DATETIME)
尊敬的大师,您知道问题和解决方案是什么吗?这似乎是一个有人必须以前见过的问题......
谢谢蒂梅克