2011-03-17 49 views
172

Tôi có tình huống mà tôi đang khởi tạo mô hình của mình trong DatabaseInitializer() cho EF 4.1 và nhận được lỗi gây phiền nhiễu này "Validation failed for one or more entities. See 'EntityValidationErrors' property for more details." Vì vậy, tôi đi đến EntityValidationErrors này và có một trường {System.Data.Entity.Validation.DbEntityValidationResult}. không có thông tin gì về lĩnh vực mà nó không thể khởi tạo. Có cách nào để có thêm thông tin về lỗi này không?Nhận loại lỗi chính xác từ DbValidationException

Để xóa những điều trên:

Tôi biết làm thế nào để khắc phục vấn đề chiều dài chuỗi. Những gì tôi hỏi là làm thế nào để tôi có được tên trường chính xác đang phá vỡ mô hình.

Trả lời

355

Trong khi bạn đang ở trong chế độ gỡ lỗi trong khối catch {...} mở cửa sổ "QuickWatch" (ctrl + alt + q) và dán trong đó:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors 

này sẽ cho phép bạn đi sâu vào cây ValidationErrors. Đó là cách dễ nhất tôi đã tìm thấy để có được cái nhìn sâu sắc ngay lập tức vào các lỗi này.

Cho Visual 2012+ người dùng chỉ quan tâm về lỗi đầu tiên và có thể không có một khối catch, thậm chí bạn có thể làm:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors.First().ValidationErrors.First().ErrorMessage 
+8

Điều này tốt hơn câu trả lời khác :) – Doug

+93

Nếu bạn không có khối catch, bạn có thể thay thế 'ex' bằng' $ exception' và nhận kết quả tương tự. – Ecyrb

+0

cũng đảm bảo bạn thay thế 'ex' bằng w/e của bạn' bắt (ngoại lệ này) 'là – Eonasdan

4

Vâng, tôi có cùng một vấn đề. . Mô hình của tôi làm việc tốt trong EF CTP5 nhưng thất bại trong việc xây dựng trong 4.1 với lỗi tương tự "" Validation thất bại cho một hoặc nhiều tổ chức" khi tôi đã cố gắng để initalize nó tôi đã tìm ra rằng tôi đã sở hữu:

public string Comment {get; set;} 

Sau đó, trong phương pháp hạt giống trong bộ khởi tạo ghi đè, tôi đã có một chút dài (khoảng 600 chữ cái) bình luận

Tôi nghĩ rằng: trong EF 4.1 bạn để đặt chú thích dữ liệu một cách rõ ràng trong một số trường hợp. :

[StringLength(4000)] 
public string Comment {get; set;} 

đã giúp. Thật kỳ lạ vì CTP5 không có vấn đề gì với điều đó.

+0

Vâng những gì tôi đã hỏi là làm cách nào để tôi có được tên thuộc tính chính xác đang phá vỡ mô hình. Mặc dù, tôi đã cố gắng khắc phục vấn đề bạn đã nói bằng cách sử dụng [StringLength (Int32.MaxValue)] như một thuộc tính cho thuộc tính của tôi (như đã được Ladislav Mrnka gợi ý và tôi đã nói về nó trong câu hỏi này http://stackoverflow.com/questions/5346155/ef-code-first-4-1-không-hỗ trợ-nvarcharmax-ở-tất cả) Powodzenia! =) –

+0

Điều này đã bị ném khi tôi thêm thuộc tính mới vào mô hình của mình trong 4.1. Đã hoạt động hoàn hảo trong 4.1 trước đây. Kỳ dị. Giải quyết bằng cách thêm chú thích cho tất cả các thuộc tính trong mô hình. –

122

Bạn có thể thử điều này trong khối thử/nắm bắt?

catch (DbEntityValidationException dbEx) 
{ 
    foreach (var validationErrors in dbEx.EntityValidationErrors) 
    { 
     foreach (var validationError in validationErrors.ValidationErrors) 
     { 
      Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
     } 
    } 
} 
+1

chính xác những gì tôi cần. cảm ơn rất nhiều! –

+8

Xem câu trả lời của tôi nếu bạn không muốn thay đổi bất kỳ mã nào. – GONeale

1

tôi thấy nó hữu ích để tạo ra một wrapper SaveChanges mà làm cho EntityValidationErrors hơn có thể đọc được:

Public Sub SaveChanges(entities As Entities) 

    Try 
     entities.SaveChanges() 

    Catch ex As DbEntityValidationException 

     Dim msg As New StringBuilder 
     msg.AppendLine(ex.Message) 

     For Each vr As DbEntityValidationResult In ex.EntityValidationErrors 
      For Each ve As DbValidationError In vr.ValidationErrors 
       msg.AppendLine(String.Format("{0}: {1}", ve.PropertyName, ve.ErrorMessage)) 
      Next 
     Next 

     Throw New DbEntityValidationException(msg.ToString, ex.EntityValidationErrors, ex) 

    End Try 

End Sub 

và sau đó thay đổi 'entities.SaveChanges()' để 'SaveChanges (thực thể)' trong toàn bộ dự án của tôi

8

Các solu tốt nhất theo ý kiến ​​của tôi, là xử lý loại lỗi này theo cách tập trung.

chỉ cần thêm phương pháp này để những lớp học chính DbContext:

public override int SaveChanges() 
{ 
    try 
    { 
     return base.SaveChanges(); 
    } 
    catch (DbEntityValidationException ex) 
    { 
     string errorMessages = string.Join("; ", ex.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.PropertyName + ": " + x.ErrorMessage)); 
     throw new DbEntityValidationException(errorMessages); 
    } 
} 

này sẽ ghi đè phương pháp của ngữ cảnh của bạn SaveChanges() và bạn sẽ nhận được một dấu phẩy tách ra danh sách chứa tất cả các lỗi xác nhận thực thể.

hy vọng điều này hữu ích.

Các vấn đề liên quan