1

让我们考虑一下 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)

尊敬的大师,您知道问题和解决方案是什么吗?这似乎是一个有人必须以前见过的问题......

谢谢蒂梅克

4

2 回答 2

3

我知道这是一个老问题,但答案可能对其他人有所帮助......如果您使用的是System.Data.SQLite提供程序,您只需要DateTimeKind=Utc在连接字符串中指定。日期现在将被读取为 UTC。

于 2015-06-28T18:54:42.707 回答
0

我对 sqlite 和 sql server 有类似的问题。我将所有 DateTime.Kind 更改为未指定,然后它不会更改它。我不确定这是否是我这边的错误,也没有时间进一步分析它。如果您可以隔离问题并证明它是一个错误,那么如果您在错误跟踪器中报告它会很棒。

于 2012-05-21T06:40:48.657 回答