2011-08-09 14 views
5

非常に単純なクラスのマッピングを検証する際に問題が発生しました。日時の流暢なnhibernateマッピングの確認

System.ApplicationException:プロパティのために「を作成」期待同じ 要素が、同じ値の型の「2011年8月9日午前12時07分55秒 AM」「のSystem.DateTime」が異なる要素を得ました。ヒント:PersistenceSpecification オブジェクトの作成時に CustomEqualityComparerを使用してください。

私はequalsのオーバーライドを作成してhashcodeメソッドを取得しようとしましたが、同じエラーが発生しました。私は永続性仕様テストのためにカスタムequality comparerを掘り起こし、同じエラーを再度打ちました。私はおそらく朝に目の新鮮なセットでこれを見てくださいが、私は非常に基本的なものが欠けていると感じています。

ありがとうございます。

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

答えて

11

あなたは、日付時刻を比較するとき、彼らは同じですが、彼らはダニ(100ナノ秒)まで変えることができようにそれが見えるかもしれませんので、注意する必要があります。おそらく、SQL Serverは日付時刻を正確に格納していないため、失敗している可能性があります。

おそらく、年、月、日、時、分、秒を比較するようなカスタム等価比較関数を使用する必要があります。

も、この記事を見てみましょう: Why datetime cannot compare?

+0

おかげコールが、私は最後の夜、私はベッドに行っている必要があり、新たな、ちょうどこれを見た:

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

あなた仕様のテストはこのようなものになり朝の新鮮な視点で – Jesse

4

をメモリ内のSQLiteのセッションを使用している間、私はちょうどこれに走りました。私はそれを使ってデバッグを行い、DateTimesの "Milliseconds"と "Kind"プロパティが異なっていることに気付きました( "Utc" Kind対 "Unspecified")。

コールWの提案あたりの私の実装:

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