Я устанавливаю тест NUnit как таковой:
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. Я использую Автоматическое Отображение и объявляю ActionDate как свойство DateTime в C#.
Если я изменяю тест для использования DateTime. Сегодня тестовая передача.
Мой вопрос состоит в том, почему тест перестал работать с DateTime. Теперь? NHibernate теряет некоторую точность при сохранении даты к базе данных и раз так как действительно предотвращают терение?Спасибо.
Поскольку сервер sql не может хранить все миллисекунды (округленные с шагом 0,003 / 0,004 /.007 секунд, как вы можете видеть в msdn ), вы должны усечь значение DateTime в C # перед передачей его методу CheckProperty, поскольку DateTime, полученный из базы данных, не идентичен вашему DateTime.Now из-за потери точности.
Если вам нужна точность только для секунд, например, вы можете усечь миллисекунды, как показано в ответе на вопрос SO: Как сократить миллисекунды из .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());