2013-07-30 4 views
5

자동 생성 된 Entity Framework 모델이 있습니다. 데이터베이스 첫 번째 접근 방식을 사용하여 생성되었습니다. mid_initial 열에는 열을 최대 3 자 길이로 제한하는 데이터베이스 정의 제약 조건이 있습니다. 나는 시도하고 mid_initial 큰 3 자 이하, 유효하지 않은 상태로 모델을 만들 때데이터베이스 첫 번째 유효성 검사

//------------------------------------------------------------------------------ 
// <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; } 
    } 
} 

, ModelState.IsValid 사실이 반환됩니다. 이 때문에 db.SaveChanges이 호출되면 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); 
    } 
} 

ModelState.IsValid 메서드가 true를 반환하는 이유는 무엇입니까? 내 모델이 최대 길이 제한을 인식하지 못하는 것 같습니다. 어떻게 알 수 있습니까?

답변

4

EF db-first는 데이터베이스에서 제약 조건을 유추 할 수 없습니다.

사용 MaxLenght 데이터 주석 속성 :

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

참고 :이 클래스는 자동으로 생성 된 클래스 및 업데이트와 모델 (.EDMX 파일)를 저장할 때마다입니다,이 코드를 덮어을 받고 ' 너의 속성을 잃어 버릴거야.

이를 방지하려면 자동 생성 클래스와 이름이 같고 동일한 네임 스페이스를 사용하여 부분 클래스로 클래스를 확장해야합니다. 방법을 보여주기 위해 예제가 필요하다면, 답변에 넣으라고 말해주십시오.

+0

닫기 ...하지만 이해할 수는 있어도 작동하지 않습니다. 컴파일러는 다음과 같이 말할 것입니다 : "에러 2 타입 '등록자'에 이미 'mid_initial'에 대한 정의가 포함되어 있습니다.). 클래스 등록자를 MetadataType 속성으로 표시하고 유효성 검사를 위해 다른 클래스를 생성해야합니다. com/questions/25722866/ef5-db-first-generated-models-and-custom-validation/25741213 # 25741213 –

3

MVC는 EF를 사용하지 않으므로 EF 유효성 검사를 사용하여 ModelState를 채우기 위해 암시 적으로 모델 유효성 검사를 시도하지 않습니다. MVC 필터, DbContext.GetValidationErrors 및 ModelState를 사용하여 예를 들어,

  • 그들을 후크 자신 :

    당신은 내가 지금 생각할 수있는 네 가지 기본 솔루션을 가지고있다.

  • 이미이를 수행하는 타사 코드를 찾아서 사용하십시오.
  • MVC에서 사용할 수있는 기능 (예 : DataAnnotations)을 사용하여 코드를 개별적으로 유효성을 검사합니다. EF T4 템플릿을 수정하여 자동으로 생성하려고 할 수 있습니다. 이것은 여전히 ​​기술적으로 중복됨을 유의하십시오 (코드는 MVC에 의해 한 번, EF에 의해 한 번 두 번 유효성이 검사 됨).
  • MVC에 대한 패치를 제출하여 명시 적으로 (종속 항목) 프로젝트를 모두 제출하고 (두 프로젝트가 모두 오픈 소스 임) - 또는 이미 완료 했으므로 downvote me로 설정하십시오. 그것.
관련 문제