자습서: ASP.NET MVC 앱을 사용하여 EF Database First에 대한 데이터 유효성 검사 향상

MVC, Entity Framework 및 ASP.NET 스캐폴딩을 사용하여 기존 데이터베이스에 대한 인터페이스를 제공하는 웹 애플리케이션을 만들 수 있습니다. 이 자습서 시리즈에서는 사용자가 데이터베이스 테이블에 있는 데이터를 표시, 편집, 만들기 및 삭제할 수 있도록 하는 코드를 자동으로 생성하는 방법을 보여 줍니다. 생성된 코드는 데이터베이스 테이블의 열에 해당합니다.

이 자습서에서는 데이터 모델에 데이터 주석을 추가하여 유효성 검사 요구 사항 및 표시 서식을 지정하는 데 중점을 둡니다. 댓글 섹션에 있는 사용자의 피드백에 따라 개선되었습니다.

이 자습서에서는 다음을 수행합니다.

  • 데이터 주석 추가
  • 메타데이터 클래스 추가

사전 요구 사항

데이터 주석 추가

이전 항목에서 보았듯이 일부 데이터 유효성 검사 규칙은 사용자 입력에 자동으로 적용됩니다. 예를 들어 Grade 속성에 대한 숫자만 제공할 수 있습니다. 더 많은 데이터 유효성 검사 규칙을 지정하려면 모델 클래스에 데이터 주석을 추가할 수 있습니다. 이러한 주석은 지정된 속성에 대해 웹 애플리케이션 전체에 적용됩니다. 속성이 표시되는 방식을 변경하는 서식 특성을 적용할 수도 있습니다. 예를 들어 텍스트 레이블에 사용되는 값을 변경합니다.

이 자습서에서는 데이터 주석을 추가하여 FirstName, LastName 및 MiddleName 속성에 제공된 값의 길이를 제한합니다. 데이터베이스에서 이러한 값은 50자로 제한됩니다. 그러나 웹 애플리케이션에서 문자 제한은 현재 적용되지 않습니다. 사용자가 해당 값 중 하나에 대해 50자 이상을 제공하는 경우 데이터베이스에 값을 저장하려고 할 때 페이지가 충돌합니다. 또한 학년을 0에서 4 사이의 값으로 제한합니다.

모델>ContosoModel.edmx>ContosoModel.tt 선택하고 Student.cs 파일을 엽니다. 다음 강조 표시된 코드를 클래스에 추가합니다.

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Student
    {
        public Student()
        {
            this.Enrollments = new HashSet<Enrollment>();
        }
    
        public int StudentID { get; set; }
        [StringLength(50)]
        public string LastName { get; set; }
        [StringLength(50)]
        public string FirstName { get; set; }
        public Nullable<System.DateTime> EnrollmentDate { get; set; }
        [StringLength(50)]
        public string MiddleName { get; set; }
    
        public virtual ICollection<Enrollment> Enrollments { get; set; }
    }
}

Enrollment.cs를 열고 강조 표시된 다음 코드를 추가합니다.

namespace ContosoSite.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    public partial class Enrollment
    {
        public int EnrollmentID { get; set; }
        [Range(0, 4)]
        public Nullable<decimal> Grade { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
    
        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
    }
}

솔루션을 빌드합니다.

학생 목록을 클릭하고 편집을 선택합니다. 50자를 초과하여 입력하려고 하면 오류 메시지가 표시됩니다.

오류 메시지 표시

홈페이지로 돌아가기. 등록 목록을 클릭하고 편집을 선택합니다. 4 이상의 성적을 제공하려고 시도합니다. 이 오류가 표시됩니다. 필드 등급은 0에서 4 사이여야 합니다.

메타데이터 클래스 추가

유효성 검사 특성을 모델 클래스에 직접 추가하면 데이터베이스가 변경되지 않을 때 작동합니다. 그러나 데이터베이스가 변경되고 모델 클래스를 다시 생성해야 하는 경우 모델 클래스에 적용한 모든 특성이 손실됩니다. 이 방법은 매우 비효율적이며 중요한 유효성 검사 규칙을 잃을 수 있습니다.

이 문제를 방지하려면 특성을 포함하는 메타데이터 클래스를 추가할 수 있습니다. 모델 클래스를 메타데이터 클래스에 연결하면 해당 특성이 모델에 적용됩니다. 이 방법에서는 메타데이터 클래스에 적용된 모든 특성을 잃지 않고 모델 클래스를 다시 생성할 수 있습니다.

Models 폴더에 Metadata.cs라는 클래스를 추가합니다.

Metadata.cs의 코드를 다음 코드로 바꿉니다.

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    public class StudentMetadata
    {
        [StringLength(50)]
        [Display(Name="Last Name")]
        public string LastName;

        [StringLength(50)]
        [Display(Name="First Name")]
        public string FirstName;

        [StringLength(50)]
        [Display(Name="Middle Name")]
        public string MiddleName;

        [Display(Name = "Enrollment Date")]
        public Nullable<System.DateTime> EnrollmentDate;
    }

    public class EnrollmentMetadata
    {
        [Range(0, 4)]
        public Nullable<decimal> Grade;
    }
}

이러한 메타데이터 클래스에는 이전에 모델 클래스에 적용한 모든 유효성 검사 특성이 포함됩니다. Display 특성은 텍스트 레이블에 사용되는 값을 변경하는 데 사용됩니다.

이제 모델 클래스를 메타데이터 클래스와 연결해야 합니다.

Models 폴더에서 PartialClasses.cs라는 클래스를 추가합니다.

파일 내용을 다음 코드로 바꿉니다.

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoSite.Models
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    [MetadataType(typeof(EnrollmentMetadata))]
    public partial class Enrollment
    {
    }
}

각 클래스는 클래스로 partial 표시되고 각 클래스는 자동으로 생성되는 클래스로 이름 및 네임스페이스와 일치합니다. 부분 클래스에 메타데이터 특성을 적용하면 데이터 유효성 검사 특성이 자동으로 생성된 클래스에 적용됩니다. 메타데이터 특성이 다시 생성되지 않은 부분 클래스에 적용되므로 모델 클래스를 다시 생성할 때 이러한 특성은 손실되지 않습니다.

자동으로 생성된 클래스를 다시 생성하려면 ContosoModel.edmx 파일을 엽니다. 다시 한 번 디자인 화면을 마우스 오른쪽 단추로 클릭하고 데이터베이스에서 모델 업데이트를 선택합니다. 데이터베이스를 변경하지 않았더라도 이 프로세스는 클래스를 다시 생성합니다. 새로 고침 탭에서 테이블마침을 선택합니다.

ContosoModel.edmx 파일을 저장하여 변경 내용을 적용합니다.

Student.cs 파일 또는 Enrollment.cs 파일을 열고 이전에 적용한 데이터 유효성 검사 특성이 더 이상 파일에 없는지 확인합니다. 그러나 애플리케이션을 실행하고 데이터를 입력할 때 유효성 검사 규칙이 계속 적용됩니다.

결론

이 시리즈에서는 사용자가 데이터를 편집, 업데이트, 만들고 삭제할 수 있도록 기존 데이터베이스에서 코드를 생성하는 방법에 대한 간단한 예제를 제공했습니다. MVC 5, Entity Framework 및 ASP.NET 스캐폴딩을 ASP.NET 사용하여 프로젝트를 만들었습니다.

Code First 개발의 소개 예제는 ASP.NET MVC 5를 사용한 시작 참조하세요.

고급 예제는 ASP.NET MVC 4 앱에 대한 Entity Framework 데이터 모델 만들기를 참조하세요. Database First의 데이터 작업에 사용하는 DbContext API는 Code First의 데이터 작업에 사용하는 API와 동일합니다. Database First를 사용하려는 경우에도 Code First 자습서에서 관련 데이터 읽기 및 업데이트, 동시성 충돌 처리 등과 같은 더 복잡한 시나리오를 처리하는 방법을 알아볼 수 있습니다. 유일한 차이점은 데이터베이스, 컨텍스트 클래스 및 엔터티 클래스를 만드는 방법에 있습니다.

추가 리소스

속성 및 클래스에 적용할 수 있는 데이터 유효성 검사 주석의 전체 목록은 System.ComponentModel.DataAnnotations를 참조하세요.

다음 단계

이 자습서에서는 다음을 수행합니다.

  • 추가된 데이터 주석
  • 메타데이터 클래스가 추가됨

Azure App Service 웹앱 및 SQL 데이터베이스를 배포하는 방법을 알아보려면 다음 자습서를 참조하세요.