Проверка даты и времени беглого отображения nhibernate - PullRequest
5 голосов
/ 09 августа 2011

Я сталкиваюсь с проблемой при проверке сопоставлений очень простого класса.

System.ApplicationException: для свойства 'Created' ожидается тот же элемент, но получен другой элемент с тем же значением '09.08.2011 12:07:55 'типа' System.DateTime '.Совет: используйте CustomEqualityComparer при создании объекта PersistenceSpecification.

Я попытался создать переопределения для методов equals и get hashcode, что привело к той же ошибке.Я покопался в пользовательском компараторе равенства для тестирования спецификации персистентности и снова столкнулся с той же ошибкой.Возможно, мне стоит взглянуть на это свежим взглядом утром, но я чувствую, что упускаю что-то очень простое.

Спасибо всем.

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

Ответы [ 2 ]

11 голосов
/ 09 августа 2011

Вы должны быть осторожны при сравнении даты и времени, потому что может показаться, что они одинаковы, но могут варьироваться вплоть до отметок (100 наносекунд). Вероятно, сбой, потому что sql-сервер не хранит точное время.

Вам понадобится пользовательский компаратор равенства, чтобы сравнивать только год, месяц, день, час, минуту и ​​секунду.

Взгляните и на эту статью: Почему дату и время нельзя сравнивать?

4 голосов
/ 07 августа 2012

Я только что столкнулся с этим во время использования сеанса SQLite в памяти.Я отладил его и заметил, что свойства DateTimes «Миллисекунды» и «Вид» различаются (тип «Utc» и «Не определено»).

Моя реализация в соответствии с предложением Коула 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();
    }
}

Ваш тест спецификации становится примерно таким:

var maxDifference = TimeSpan.FromSeconds(1);
...
new PersistenceSpecification<Blah>(Session)
    ...
    .CheckProperty(c => c.Created, System.DateTime.Now,
            new DateTimeEqualityComparer(maxDifference))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...