Enity Framework Core에서 문자열 및 Enum 양방향 매핑

본고에서 사용한 코드는 다음과 같다.
https://github.com/noobow34/MappingStringToEnumInEntityFrameworkCore
아무 생각 없이 그대로 실행한다면 행동할 것이다.
SQLite를 사용했기 때문에 데이터베이스가 없는 파일도 무단으로 만들어진다.
실제 작성된 SQLite 데이터베이스에서 결과를 확인하십시오.
한편 이 기사는 C#로 표시되지만 기본적으로 VB다.NET도 마찬가지다.

하고 싶은 일


제목과 같다.
흔히 있는 '00 코드' 처럼 정해진 값만 가져오는 DB의 문자 직렬 (char 또는 varchar) 을 가정합니다.
엔티티 클래스 측면(C# 측면)에서도 얻을 수 있는 값을 제한하기 위해 Enum을 사용합니다.
이번 예로 USER표의 젠더열(성별)은 남성'M', 여성'F'만 설정할 수 있다.
C#의 Enum은 내부에서 int이며, Java와 달리 문자열(string) 값을 가진 Enum은 언어의 표준 기능에서 사용할 수 없습니다.
또한 솔리드 클래스에서 속성 유형을 Enum으로 설정하는 경우 문자열을 변환하는 방법을 정의해야 합니다.
이상에 비해 이번 목적을 달성하기 위해서는 두 가지 절차가 필요하다.
1. 문자열의 Enum 정의
Enum의 멤버는 문자열 값(string)을 가져야 합니다.
또한 string Enum의 양방향 변환 방법이 필요합니다.
Enum→string: 데이터베이스의 문자열에 저장하려면
string→Enum: 데이터베이스에서 얻은 문자열을 Enum으로 실체 클래스 속성에 저장할 때 필요한
2. 솔리드 클래스의 Enum 처리 문자열(Enum에 매핑)

1. 문자열의 Enum 정의


C#의 언어 표준 기능에서는 문자열의 Enum을 정의할 수 없습니다.
인용과 확장 방법을 통해 실현할 수 있는 방법이 있다.
예를 들어 아래의 문장은 예이다.
C#>enum에 문자열을 할당합니다.
그러나 디렉터리와 확장 방법을 정의하지 않아도 프로그램 라이브러리가 있다.
이번엔 이걸로nuget을 통해 항목을 가져오십시오.
EnumStringValues StringValue 아차르트에서 Enum에 대응하는 문자열을 정의합니다.
GenderEnum.cs
//~~~略 全体はGitHubからGenderEnum.csをみてください
public enum GenderEnum
{
    [StringValue("M")]
    Male,
    [StringValue("F")]
    Female
}
//~~~略
이렇게 하면 Enum.GetStringValue()에서 문자열을 얻을 수 있습니다.
GenderEnum.Male.GetStringValue(); //"M"が返ってくる
GenderEnum.Female.GetStringValue(); //"F"が返ってくる
반면 문자열(이번에는 F, M)은 Enum.ParseToEnum<T>()에 사용됩니다.
"M".ParseToEnum<GenderEnum>(); //GenderEnum.Maleが返ってくる
"F".ParseToEnum<GenderEnum>(); //GenderEnum.FeMaleが返ってくる
//
string gender = "M";
gender.ParseToEnum<GenderEnum>(); //当然、定数ではなくて変数でもOK
이렇게 하면 string Enum의 양방향 변환이 실현됩니다.

2. 솔리드 클래스의 Enum 처리 문자열(Enum에 매핑)


먼저 솔리드 클래스에서 해당 속성의 유형을 Enum으로 설정해야 합니다.
User.cs
//~~~略 全体はGitHubからUser.csをみてください
[Column("GENDER")]
public GenderEnum? Gender { get; set; } //プロパティの型をEnumにしておく
//~~~略
그러면
• 데이터베이스에서 얻은 값을 Enum으로 변환하여 속성에 저장하는 방법
• Enum에서 문자열로 변환하여 데이터베이스에 로그인하는 방법
어떻게 정의를 내리죠?
값 변환(Value Conversion).
DbContextOnModelCreating에서 다음과 같이 정의됩니다.
TestDbContext.cs
//~~~略 全体はGitHubからTestDbContext.csをみてください
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //Conversionを使用してEnumとの対応関係を定義
    modelBuilder.Entity<User>() //Userエンティティの
       .Property(u => u.Gender) //Genderプロパティに
       .HasConversion //値の変換を設定
       //EnumをGetStringValueしたものがDBに登録される
       (g => g.GetStringValue()
       //DBから取得した値をParseToEnumしたものがEnumとしてプロパティに格納される
       , g => ((string)g).ParseToEnum<GenderEnum>());
}
//~~~略
이렇게 하면 Enum의 속성과 데이터베이스를 양방향으로 교환할 수 있다(등록, 얻기).

실행하다


Program.cs
//~~~略 全体はGitHubからProgram.csをみてください
//登録
using (var context = new TestDbContext(options))
{
    context.Users.Add(new User { Name = "Bob", Gender = GenderEnum.Male }); //Maleは'M'として登録される
    context.Users.Add(new User { Name = "Elizabeth", Gender = GenderEnum.Female }); //Femaleは'F'として登録される
    context.SaveChanges();
}

//取得
using (var context = new TestDbContext(options))
{
    foreach (var user in context.Users)
    {
        Console.WriteLine($"Id:{user.Id}");
        Console.WriteLine($"Name:{user.Name}");
        Console.WriteLine($"Gender(Enum):{user.Gender}");
        Console.WriteLine($"Gender(String):{user.Gender.GetStringValue()}");
        Console.WriteLine("---------------------------");
    }
}
실행 결과
Enum과 string의 전환이 정확하다는 것을 알 수 있습니다.
Id:1
Name:Bob
Gender(Enum):Male
Gender(String):M
---------------------------
Id:2
Name:Elizabeth
Gender(Enum):Female
Gender(String):F
---------------------------
데이터베이스에서 "M", "F"로 등록된 것을 알 수 있다.

좋은 웹페이지 즐겨찾기