2011-08-09 63 views
5

我在驗證非常簡單的類上的映射時遇到問題。驗證日期時間流利的nhibernate映射

System.ApplicationException:對於財產「創造」預期相同 元素,卻得到了與同值類型的「2011年8月9日 上午12時07分55秒「System.DateTime的」不同的元素。提示:創建PersistenceSpecification 對象時,請使用 CustomEqualityComparer。

我已經嘗試創建覆蓋的等於和獲取哈希碼方法,並導致相同的錯誤。我深入到自定義相等比較器進行持久性規範測試,並再次遇到同樣的錯誤。我也許應該在早上用一雙全新的眼睛來看看,但我覺得我錯過了一些非常基本的東西。

謝謝大家。

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

感謝科爾,我新我應該去睡覺昨晚只是看着這個在早上有一個全新的視角。 – Jesse

4

我只是碰到了這個同時使用一個內存中的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))