2013-07-30 19 views
5

Tôi có mô hình Khung thực thể được tạo tự động. Nó được tạo ra bằng cách sử dụng một phương pháp tiếp cận cơ sở dữ liệu đầu tiên. Cột mid_initial có ràng buộc xác định cơ sở dữ liệu giới hạn cột ở độ dài tối đa là 3 ký tự.Cơ sở dữ liệu Xác thực lần đầu

//------------------------------------------------------------------------------ 
// <auto-generated> 
// This code was generated from a template. 
// 
// Manual changes to this file may cause unexpected behavior in your application. 
// Manual changes to this file will be overwritten if the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace Agency.DataAccess.RegistrationModel 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Registrant 
    { 
     public Registrant() 
     { 
     } 

     public int id { get; set; } 
     public string fname { get; set; } 
     public string mid_initial { get; set; } 
     public string lname { get; set; } 
    } 
} 

Khi tôi cố gắng và tạo ra một mô hình với một mid_initial lớn hơn 3 ký tự, một trạng thái không hợp lệ, ModelState.IsValid đang trở thành sự thật. Bởi vì điều này db.SaveChanges sau đó được gọi, sau đó tăng DbEntityValidationException.

[HttpPost] 
public ActionResult Create(Registrant registrant) 
{  
    try 
    { 
     if (ModelState.IsValid) 
     { 
      Debug.WriteLine("Entity was valid."); 
      db.Registrants.Add(registrant); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View("Create", registrant); 
    } 
    catch (DbEntityValidationException e) 
    { 
     foreach (var eve in e.EntityValidationErrors) 
     { 
      Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
       eve.Entry.Entity.GetType().Name, eve.Entry.State); 
      foreach (var ve in eve.ValidationErrors) 
      { 
       Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
        ve.PropertyName, ve.ErrorMessage); 
      } 
     } 
     return View(registrant); 
    } 
} 

Tại sao phương pháp ModelState.IsValid trả về đúng? Có vẻ như mô hình của tôi không biết về giới hạn độ dài tối đa. Làm thế nào để làm cho nó nhận thức?

Trả lời

4

EF db-first không thể suy ra các ràng buộc từ cơ sở dữ liệu.

Sử dụng MaxLenght dữ liệu chú thích thuộc tính:

public partial class Registrant 
{ 
    public Registrant() 
    { 
    } 

    public int id { get; set; } 
    public string fname { get; set; } 
    [MaxLength(3, ErrorMessage = "")] 
    public string mid_initial { get; set; } 
    public string lname { get; set; } 
} 

Lưu ý: lớp này là một tự động tạo lớp và mỗi khi bạn cập nhật và lưu mô hình của bạn (file .EDMX), mã này sẽ được ghi đè và bạn' sẽ mất các thuộc tính của bạn.

Để tránh điều đó, bạn nên mở rộng các lớp học của mình với một số lớp học một phần có cùng tên và cùng một không gian tên như các lớp được tạo tự động của bạn. Nếu bạn cần các ví dụ để chỉ cho bạn cách, hãy cho tôi biết để đưa nó vào câu trả lời.

+0

Đóng ... Nhưng, như tôi hiểu, nó sẽ không hoạt động. Trình biên dịch sẽ nói: "Lỗi 2 Kiểu 'Người đăng ký' đã chứa định nghĩa cho 'mid_initial' ...). Cần đánh dấu lớp' Người đăng ký' bằng thuộc tính 'MetadataType' và tạo một lớp khác để xác nhận hợp lệ http: // stackoverflow. com/questions/25722866/ef5-db-first-generated-models-and-custom-validation/25741213 # 25741213 –

3

MVC là EF-thuyết bất khả tri, và như vậy không ngầm cố gắng xác thực mô hình bằng cách sử dụng xác thực EF để điền mô hình của nó.

Bạn có bốn giải pháp cơ bản tôi có thể nghĩ ngay bây giờ:

  • Hook họ lên chính mình, ví dụ như sử dụng bộ lọc MVC, DbContext.GetValidationErrors và ModelState.
  • Tìm và sử dụng mã của bên thứ ba đã thực hiện điều này.
  • Xác thực mã riêng bằng các cơ sở mà MVC có thể sử dụng, ví dụ: sử dụng DataAnnotations. Bạn có thể thử tạo chúng tự động bằng cách sửa đổi mẫu EF T4. Lưu ý rằng điều này vẫn còn dư thừa về mặt kỹ thuật (mã sẽ được xác thực hai lần, một lần bởi MVC, một lần bằng EF).
  • Gửi bản vá cho MVC để có thể hỗ trợ EF một cách rõ ràng (làm phụ thuộc mềm) và làm cho tất cả chỉ hoạt động (cả hai dự án là nguồn mở) - hoặc downvote tôi vì họ đã làm như vậy và tôi không bao giờ biết nó.