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"로 등록된 것을 알 수 있다.
Reference
이 문제에 관하여(Enity Framework Core에서 문자열 및 Enum 양방향 매핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/noobow/items/2083affa1c6f766e7a55
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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"로 등록된 것을 알 수 있다.
Reference
이 문제에 관하여(Enity Framework Core에서 문자열 및 Enum 양방향 매핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/noobow/items/2083affa1c6f766e7a55
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
//~~~略 全体はGitHubからUser.csをみてください
[Column("GENDER")]
public GenderEnum? Gender { get; set; } //プロパティの型をEnumにしておく
//~~~略
//~~~略 全体は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>());
}
//~~~略
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"로 등록된 것을 알 수 있다.Reference
이 문제에 관하여(Enity Framework Core에서 문자열 및 Enum 양방향 매핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noobow/items/2083affa1c6f766e7a55텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)