2010-02-23 7 views
5
configuración

que una prueba de NUnit como tal:Fluido NHibernate CheckProperty y Fechas

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

Cuando ejecuto la prueba a través de NUnit me sale el siguiente error:

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

El campo ActionDate es un campo de fecha y hora en una base de datos SQL 2008. Yo uso Auto Mapping y declaro el ActionDate como una propiedad DateTime en C#.

Si cambio la prueba para usar DateTime.Today pasan las pruebas.

Mi pregunta es por qué la prueba está fallando con DateTime.Now? ¿NHibernate está perdiendo algo de precisión al guardar la fecha en la base de datos y, en caso afirmativo, cómo se evita la pérdida? Gracias.

+0

Lo curioso, me acabo de encontrar con esto mismo! – Ted

Respuesta

6

Dado que el servidor sql no puede almacenar todos los milisegundos (pero redondeado a incrementos de .003/.004/.007 segundos como se puede ver en msdn), debe truncar el valor de DateTime en C# antes de pasarlo a CheckProperty método dado que el DateTime recuperado del db no es idéntico al DateTime.Now debido a la pérdida de precisión.

Si solo necesita precisión durante segundos, por ejemplo, puede truncar los milisegundos como se ve en la respuesta a la pregunta SO: How to truncate milliseconds off of a .NET DateTime.
Si necesita más precisión, debe usar el tipo de asignación timestamp.

Puede limitar fácilmente milisegundos mediante el uso de un método de extensión:

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()); 
Cuestiones relacionadas