2010-02-23 19 views
5

I konfiguracja test NUnit jako takie:Fluent NHibernate CheckProperty i Daty

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

Kiedy uruchamiam test poprzez NUnit pojawia się następujący błąd:

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

Pole ActionDate jest polem datetime w bazie danych SQL 2008. Używam Auto Mapping i deklaruję ActionDate jako właściwość DateTime w języku C#.

Jeśli zmienię test na DateTime. Dzisiaj testy zakończą się.

Moje pytanie brzmi: dlaczego test kończy się niepowodzeniem z DateTime.Now? Czy NHibernate traci pewną precyzję zapisywania daty w bazie danych, a jeśli tak, to w jaki sposób zapobiec utracie? Dziękuję Ci.

+0

Najśmieszniejsze, po prostu wpadł na ten sam! – Ted

Odpowiedz

6

Ponieważ serwer SQL nie można zapisać wszystkie milisekund (ale po zaokrągleniu do przyrostach .003/0,004/0,007 sekundy, jak widać na msdn), należy obciąć wartości DateTime w C# przed przekazaniem go do CheckProperty Metoda od DataTime pobrane z db nie jest identyczne z DateTime.Now z powodu utraty precyzji.

Jeśli potrzebna jest precyzja tylko na sekundy, można skrócić milisekundy w odpowiedzi na pytanie dotyczące SO: How to truncate milliseconds off of a .NET DateTime.
Jeśli potrzebujesz większej precyzji, powinieneś użyć typu odwzorowania timestamp.

Można łatwo obciąć milisekund stosując metodę rozszerzenia:

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()); 
Powiązane problemy