2010-02-23 2 views
5

I 설정과 같은 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 데이터베이스에서. 자동 매핑을 사용하고 C#에서 DateTime 속성으로 ActionDate를 선언합니다.

테스트가 DateTime을 사용하도록 변경하는 경우 테스트가 통과됩니다.

내 질문에 왜 DateTime.Now로 테스트가 실패합니까? NHibernate는 데이터베이스에 날짜를 저장할 때 정밀도를 잃어 버리는가? 고맙습니다.

+0

웃긴 건, 난 그냥이에 자신을 달렸다! – Ted

답변

6

SQL Server는 밀리 초를 모두 저장할 수 없으므로 (msdn에서 볼 수 있듯이 .003/.004/.007 초 단위로 반올림 됨) C#의 DateTime 값을 잘라내어 CheckProperty로 전달해야합니다 메서드는 db에서 검색 한 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()); 
관련 문제