Verifica delle mappature di nibernazione fluenti datetime

Verifica delle mappature di nibernazione fluenti datetime

Devi fare attenzione quando confronti le date, perché possono sembrare le stesse ma possono variare fino ai tick (100 nanosecondi). Probabilmente sta fallendo perché il server sql non memorizza le date e gli orari in modo così accurato.

Avrai bisogno di utilizzare un comparatore di uguaglianza personalizzato in modo tale da confrontare solo anno, mese, giorno, ora, minuti e secondi probabilmente.

Dai un'occhiata anche a questo articolo:Perché datetime non possono essere confrontate?


Mi sono appena imbattuto in questo durante l'utilizzo di una sessione SQLite in memoria. Ho eseguito il debug e ho notato che le proprietà "Milliseconds" e "Kind" di DateTimes differivano ("Utc" Kind e "Unspecified").

La mia implementazione secondo il suggerimento di Cole W:

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();
    }
}

Il tuo test delle specifiche diventa qualcosa del genere:

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