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; } |
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.