Home Full Site
Entity Framework : Data Annotations

Data Annotation은 .NET Framework에서 Data Validation을 돕기 위해 제공되는 기능으로서 클래스의 속성에 여러 Data Annotation 특성(attribute)를 추가함으로써 별도의 코드없이 Validation 규칙을 적용할 수 있다. Entity Framework의 DbSet 클래스에서 이러한 Data Annotation을 사용하여 테이블 컬럼에 특별한 속성을 지정할 수 있으며, 또한 각 필드의 출력포맷과 특성들을 지정하여 ASP.NET MVC와 같은 외부 프레임워크에서 이러한 Validation 특성들을 활용할 수 있도록 하고 있다.

Entity Framework에서 테이블 스키마를 정의하는 클래스를 작성할 때, 컬럼타입, 최대 크기, Identity 속성 등 테이블 정의에 필요한 여러 속성들을 함께 지정할 수 있다. 또한, 클래스의 필드(컬럼)가 외부에 표시될 때, DisplayName 이나 DisplayFormat 같은 특성들을 사용할 수 있는데, 예를 들어 MVC 웹 프레임워크에서 이러한 Display 특성들을 사용하여 필드의 헤더나 포맷을 자동으로 적용한다.

아래 예제는 Customer 클래스에 여러 Data Annotation을 붙여본 샘플이다. Entity Framework에서 Primary Key (PK)를 지정하기 위해, [Key] 라는 특성을 지정한다. 만약 클래스에 Key 특성이 없으면 Id 혹은 *Id와 같이 끝이 Id로 끝나는 컬럼을 Primary Key로 사용한다. Id 컬럼은 Identity 로 만들기 위해서는 DatabaseGenerated(DatabaseGeneratedOption.Identity) 특성을 지정하면 되는데, 이를 사용하면 Id 컬럼이 DB에서 자동으로 채워진다. PK 이외에 Foreign Key를 지정하기 위해서는 [ForeignKey()] 를 사용하며, 특정 컬럼에 인덱스를 생성하기 위해서는 [Index] 특성을 지정한다.

컬럼이 반드시 데이타가 입력되어야 하는 경우 즉 NULL이 허용되지 않는 경우 [Required] 특성을 지정한다. 또한, 문자열의 최대, 최소길이를 표현하기 위해서는 MaxLength(n), MinLength(m) 특성을 지정한다.


예제

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

public class Customer
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
                
    [StringLength(100)]
    [Index(IsUnique = true)]
    public string LoginId { get; set; }

    [Display(Name = "Create Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTimeOffset CreateDate { get; set; }
                
    [Required]
    [MaxLength(100)]
    public string Name { get; set; }
    [EmailAddress]
    public string Email { get; set; }
        
    public int Age { get; set; }
}



다음은 EF에서 자주 사용되는 Data Annotation에 대한 요약이다.

Data Annotation설명예제
Table Table 속성 지정. Table명 지정 [Table("CustTab")]
public class Customer
Column Column 속성 지정 [Column("Misc", typename="ntext")]
public string Data {get; set; }
Key Primary Key 지정 [Key] public int Id { get; set; }

PK가 복수 컬럼인 경우:
[Key] [Column(Order=1)]
public string FirstName { get; set; }
[Key] [Column(Order=2)]
public string Last { get; set; }
ForeignKey Foreign Key [ForeignKey("Id")]
public int EmpId { get; set; }
Index Index 컬럼 지정 (EF 6.1+) [Index]
public int RefId { get; set; }
DatabaseGenerated DB 생성 옵션 지정 [DatabaseGenerated(DatabaseGenerationOption.Identity]
public int Id { get; set; }
Required 필수 항목. NOT NULL 필드 [Required]
public string Name { get; set; }
MaxLength 최대 길이 [MaxLength(100)]
public string Name { get; set; }
MinLength 최소 길이 [MinLength(5)]
public string Name { get; set; }
Range 최소, 최대 범위값을 지정 [Range(0, 100)]
public int Score { get; set; }
NotMapped 테이블에 저장되지 않는 필드 [NotMapped]
public int Extra { get; set; }
Timestamp Timestamp 컬럼 [Timestamp]
public byte[] TimeStamp { get; set; }
Email Email 주소 체크 [EmailAddress]
public string Email { get; set; }
© csharpstudy.com