2010-02-23 60 views
5

我設置一個NUnit測試這樣:功能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數據庫中。我使用自動映射並將ActionDate聲明爲C#中的DateTime屬性。

如果我更改測試以使用DateTime.Today測試通過。

我的問題是爲什麼測試失敗與DateTime.Now? NHibernate在將日期保存到數據庫時會失去一些精確性,如果是的話如何防止丟失?謝謝。

+0

有趣的事情,我只是碰到了這個自己! – Ted 2010-02-26 21:18:36

回答

6

由於sql服務器無法存儲所有毫秒(但可以在msdn處看到四捨五入爲.003/.004/.007秒的增量),所以應該在C#中截斷DateTime值,然後將它傳遞給CheckProperty方法,因爲從數據庫檢索到的DateTime與您的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());