2012-05-16 3 views
1

Давайте рассмотрим следующий простой класс в 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

+0

Какую версию NH вы используете? –

+0

@StefanSteinegger 3.2 – mayu

+0

Для справки. Я прекратил использовать sqlite в конце. – mayu

ответ

0

У меня была аналогичная проблема с SQLite и SQL Server. Я изменил все DateTime.Kind на неуказанные, то это не изменит его. Я не был уверен, что это ошибка на моей стороне, и у меня не было времени проанализировать ее дальше. Если вы можете изолировать проблему и доказать, что это ошибка, было бы здорово, если бы вы сообщили об этом в bug tracker.

+0

В конце концов я прекратил использовать sqlite. – mayu

2

Я знаю, что это старый вопрос, но ответ может помочь другим ... Если вы используете провайдера System.Data.SQLite, вам просто нужно указать DateTimeKind=Utc в строке подключения. Даты теперь будут считаться UTC.

+0

Это решило мою проблему навсегда. Кто-то должен принять это решение. – nover

Смежные вопросы