验证日期时间流畅的非hibernate映射

本文关键字:hibernate 映射 日期 时间 验证 | 更新日期: 2023-09-27 18:04:58

我在验证一个非常简单的类上的映射时遇到了一个问题。

系统。ApplicationException:对于属性'Created'期望相同元素,但得到不同的元素具有相同的值'8/9/201112:07:55 AM'的类型'System.DateTime'。小贴士:使用创建持久化规范时的CustomEqualityComparer对象。

我尝试为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();
}

验证日期时间流畅的非hibernate映射

在比较日期时间时必须小心,因为它们可能看起来是相同的,但它们可以变化到刻度(100纳秒)。它可能失败是因为sql server没有准确地存储日期时间。

你需要使用一个自定义的相等比较器,这样你只能比较年、月、日、小时、分钟和秒。

也看看这篇文章:为什么日期时间不能比较?

我在使用内存中的SQLite会话时遇到了这个问题。我通过它调试并注意到DateTimes的"毫秒"answers"类型"属性不同("Utc"类型vs。"不明")。

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

您的规格测试变成如下所示:

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

简单的解决方案是创建一个新的DateTime实例

[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,  new DateTime(2016, 7, 15, 3, 15, 0) )
        .VerifyTheMappings();
}