Быстрый NHibernate CheckProperty и даты

Я устанавливаю тест 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 теряет некоторую точность при сохранении даты к базе данных и раз так как действительно предотвращают терение?Спасибо.

5
задан Chris C 23 February 2010 в 18:34
поделиться

1 ответ

Поскольку сервер 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());
6
ответ дан 14 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: