Давайте рассмотрим следующий простой класс в NHibernate:NHibernate и Utc DateTimes в SQLite
<?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; }
}
Следующая команда usecase производит различные результаты при выполнении в отношении 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 создается с CreateSchema по NHibernate и сообщает SQLite Администратор, как
CREATE TABLE TestTable (Id integer primary key autoincrement, Date1 DATETIME)
Уважаемый гуру, вы знаете, в чем проблема и решение? Похоже, что проблема кто-то, должно быть, видел ...
Thanks Tymek
Какую версию NH вы используете? –
@StefanSteinegger 3.2 – mayu
Для справки. Я прекратил использовать sqlite в конце. – mayu