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) 특성을 지정한다.
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; }
}
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 주소 체크 | [EmailAddress] public string Email { get; set; } |