2011-08-09 9 views
5

Estoy encontrando un problema al verificar las asignaciones en una clase muy simple.Verificación de fecha y hora asignaciones de NHibernate fluidez

System.ApplicationException: Por propiedad 'Creado' esperada misma elemento, pero obtuvo elemento diferente con el mismo valor '8/9/2011 12:07:55 AM ' del tipo 'System.DateTime'. Consejo: utilizar un CustomEqualityComparer al crear el objeto PersistenceSpecification .

He intentado crear sustituciones de los iguales y obtener métodos hashcode y que resultó en el mismo error. Indagué en el comparador de igualdad personalizado para las pruebas de especificación de persistencia y de nuevo pulsé el mismo error. Tal vez debería echar un vistazo a esto con un nuevo par de ojos en la mañana, pero siento que me falta algo muy básico.

Gracias a todos.

public class Blah 
{ 
    public int Id { get; set; } 
    public DateTime Created { get; set; } 
    public string Description { get; set; } 
} 

[Test] 
public void Can_Correctly_Map_Blah() 
{ 
    new PersistenceSpecification<Blah>(Session) 
     .CheckProperty(c => c.Id, 1) 
     .CheckProperty(c => c.Description, "Big Description") 
     .CheckProperty(c => c.Created, System.DateTime.Now) 
     .VerifyTheMappings(); 
} 

Respuesta

11

Usted tiene que tener cuidado al comparar los tiempos de fecha, ya que puede parecer que son los mismos pero pueden variar hasta las garrapatas (100 nanosegundos). Probablemente esté fallando porque el servidor sql no almacena las fechas con tanta precisión.

que necesitará utilizar un comparador de igualdad tal costumbre que sólo se compara el año, mes, día, hora, minuto y segundo, probablemente.

Tome un vistazo a este artículo también: Why datetime cannot compare?

+0

Gracias Cole, me nueva que debería haber ido a la cama la noche anterior y sólo se veía en este con una nueva perspectiva en la mañana. – Jesse

4

Me acabo de encontrar con esto durante el uso de una sesión de SQLite en memoria. Lo depuré y noté que las propiedades de "Milisegundos" y "Tipo" de DateTimes diferían ("Utc" Tipo vs. "No especificado").

Mi aplicación por Cole W sugerencia:

class DateTimeEqualityComparer : IEqualityComparer 
{ 
    private TimeSpan maxDifference; 

    public DateTimeEqualityComparer(TimeSpan maxDifference) 
    { 
     this.maxDifference = maxDifference; 
    } 

    public bool Equals(object x, object y) 
    { 
     if (x == null || y == null) 
     { 
      return false; 
     } 
     else if (x is DateTime && y is DateTime) 
     { 
      var dt1 = (DateTime)x; 
      var dt2 = (DateTime)y; 
      var duration = (dt1 - dt2).Duration(); 
      return duration < maxDifference; 
     } 
     return x.Equals(y); 
    } 

    public int GetHashCode(object obj) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Su prueba de especificación se convierte en algo parecido a esto:

var maxDifference = TimeSpan.FromSeconds(1); 
... 
new PersistenceSpecification<Blah>(Session) 
    ... 
    .CheckProperty(c => c.Created, System.DateTime.Now, 
      new DateTimeEqualityComparer(maxDifference)) 
Cuestiones relacionadas