2010-02-23 3 views
5
установки

я тест NUnit как таковые:Fluent NHibernate CheckProperty и дата

new PersistenceSpecification<MyTable>(_session) 
    .CheckProperty(c => c.ActionDate, DateTime.Now); 

Когда я запускаю тест с помощью NUnit я получаю следующее сообщение об ошибке:

SomeNamespace.MapTest: 
System.ApplicationException : Expected '2/23/2010 11:08:38 AM' but got 
'2/23/2010 11:08:38 AM' for Property 'ActionDate' 

Поле ActionDate является поле даты и времени в базе данных SQL 2008. Я использую Auto Mapping и объявляю ActionDate в качестве свойства DateTime в C#.

Если я изменил тест на использование DateTime.Today, тесты пройдут.

Мой вопрос: почему тест терпит неудачу с DateTime.Now? Является NHibernate потери некоторой точности при сохранении даты в базе данных, и если да, то как предотвратить потерю? Спасибо.

+0

Смешная вещь, я просто побежал в это сам! – Ted

ответ

6

Так как сервер sql не может хранить все миллисекунды (но округлен до инкрементов .003/.004/.007 секунд, как вы можете видеть на msdn), вы должны усечь значение DateTime на C#, прежде чем передавать его в CheckProperty метод, поскольку DateTime, извлеченный из db, не идентичен вашей DateTime.Now из-за потери точности.

Если вам нужна точность только секунд, вы можете обрезать миллисекунды, как показано в ответе на вопрос SO: How to truncate milliseconds off of a .NET DateTime.
Если вам нужна более высокая точность, вы должны использовать тип отображения timestamp.

Вы можете легко укоротить миллисекунды, используя метод расширения:

public static class DateTimeExtension 
{ 
    public static DateTime TruncateToSeconds(this DateTime source) 
    { 
    return new DateTime(source.Ticks - (source.Ticks%TimeSpan.TicksPerSecond), source.Kind); 
    } 
} 
//<...> 
new PersistenceSpecification<MyTable>(_session) 
    .CheckProperty(c => c.ActionDate, DateTime.Now.TruncateToSeconds()); 
Смежные вопросы