닷넷(dotnet) 엔티티 프레임워크(Entity Framework)에서 enum 사용하기

닷넷(dotnet) 엔티티 프레임워크(Entity Framework)에서 enum 사용하기

엔티티 프레임워크를 사용해서 개발을 하다 보면 특정 컬럼에 값을 한정지어야 할 필요가 있다.
이럴때 enum을 활용 할 텐데 해당 값을 사용해서 처리 하는 방법은

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

using MvcMovie.Constants;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
public class Movie
{
public int Id { get; set; }
public string Title { get; set; }

[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }

[Column(TypeName = "decimal(18,2)")]
public decimal Price { get; set; }
public MovieRating Rating { get; set; }

}
}


위에 모델은 영화를 모델링 한것이고 영화에 관람등급이 존재한다.
해당 등급을 처리 하기위해서 MovieRating enum을 생성했다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.ComponentModel;

namespace MvcMovie.Constants
{
public enum MovieRating
{
[Description("일반적인 셩인영화")]
R,
[Description("전체관람가")]
G,
[Description("부모 지도하에 전체관람가")]
PG,
[Description("13세 이상 부모지도하에 관람가")]
PG13,
[Description("19금")]
NC17
}
}

위에 등급은 미국 등급기준으로 작성을 해보았다.

위처럼 하고 마이그레이션을 실행하면

1
2
Add-Migration InitialCreate

위처럼 처리를 하면 해당 필드는 int 필드로 만들어진다.
하지만 컬럼에 string 값을 저장하고 싶을때는 아래 처럼 처리 하면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;

namespace MvcMovie.Data
{
public class MvcMovieContext : DbContext
{
public MvcMovieContext(DbContextOptions<MvcMovieContext> options)
: base(options)
{
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Movie>().ToTable("Movie");
modelBuilder.Entity<Movie>().Property(c=> c.Rating).HasConversion<string>();
modelBuilder.Entity<Movie>().Property(c => c.Rating).HasDefaultValue(MovieRating.G);
base.OnModelCreating(modelBuilder);
}

public DbSet<Movie> Movie { get; set; }
}
}

위처럼 DbContext를 상속 받은 클래스에서 OnModelCreating 메소드를 오버라이딩해서
modelBuilder.Entity<Movie>().Property(c=> c.Rating).HasConversion<string>(); 처럼 Rating 필드를 string을 처리 해주면 string 필드로 변환이 된다.

참조