2011-08-09 33 views
5

Tôi đang gặp sự cố khi xác minh ánh xạ trên một lớp rất đơn giản.Xác minh ánh xạ nhibernate fluent nhibernate

System.ApplicationException: Đối với tài sản 'Created' dự kiến ​​sẽ cùng yếu tố, nhưng có yếu tố khác nhau với cùng một giá trị '2011/08/09 00:07:55' kiểu 'System.DateTime'. Mẹo: sử dụng CustomEqualityComparer khi tạo đối tượng PersistenceSpecification .

Tôi đã thử tạo ghi đè cho bằng và nhận phương thức mã băm và dẫn đến lỗi tương tự. Tôi đào vào so sánh bình đẳng tùy chỉnh cho thử nghiệm đặc điểm kỹ thuật kiên trì và một lần nữa nhấn lỗi tương tự. Tôi có lẽ nên nhìn vào điều này với một bộ mắt mới vào buổi sáng nhưng tôi cảm thấy tôi đang thiếu một cái gì đó rất cơ bản.

Cảm ơn tất cả.

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

Trả lời

11

Bạn phải cẩn thận khi so sánh thời gian ngày vì có vẻ như chúng giống nhau nhưng chúng có thể khác nhau đến các dấu tích (100 nano giây). Nó có thể không thành công vì máy chủ sql không lưu trữ ngày tháng chính xác.

Bạn sẽ cần sử dụng trình so sánh bình đẳng tùy chỉnh để bạn chỉ so sánh năm, tháng, ngày, giờ, phút và giây có thể.

Hãy xem bài viết này quá: Why datetime cannot compare?

+0

Cảm ơn Cole, tôi mới ra tôi nên đi ngủ đêm qua và chỉ nhìn này với một quan điểm mới vào buổi sáng. – Jesse

4

Tôi chỉ chạy vào này trong khi sử dụng một phiên SQLite trong bộ nhớ. Tôi đã sửa lỗi thông qua nó và nhận thấy rằng các thuộc tính DateTimes '"Mili giây" và "Loại" khác nhau ("Utc" Kind so với "Unspecified").

thực hiện của tôi mỗi Cole W của đề nghị:

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

kiểm tra đặc điểm kỹ thuật của bạn trở thành một cái gì đó như thế này:

var maxDifference = TimeSpan.FromSeconds(1); 
... 
new PersistenceSpecification<Blah>(Session) 
    ... 
    .CheckProperty(c => c.Created, System.DateTime.Now, 
      new DateTimeEqualityComparer(maxDifference)) 
Các vấn đề liên quan