web-dev-qa-db-ja.com

文字列として保存されたEF Core 2.0 Enum

Enumを文字列としてデータベースに格納できました。

builder.Entity<Company>(eb =>
{
    eb.Property(b => b.Stage).HasColumnType("varchar(20)");
});

しかし、クエリを実行するときに、EFは文字列を列挙型に解析する方法を知りません。どうすればクエリできますか?

context
    .Company
        .Where(x => x.Stage == stage)

これは例外です:varchar値 'Opportunity'をデータ型intに変換するときに変換が失敗しました

15
Brad Firesheets

値の変換機能はEF Core 2.1の新機能です。

値コンバーターを使用すると、データベースの読み取りまたは書き込み時にプロパティ値を変換できます。この変換は、1つの値から同じ型の別の値(たとえば、文字列の暗号化)へ、または1つの型の値から別の型の値へ(たとえば、列挙値とデータベース内の文字列との間の変換)にすることができます。

public class Rider
{
    public int Id { get; set; }
    public EquineBeast Mount { get; set; }
}

public enum EquineBeast
{
    Donkey,
    Mule,
    Horse,
    Unicorn
}

独自の変換を使用できます

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Rider>()
        .Property(e => e.Mount)
        .HasConversion(
            v => v.ToString(),
            v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
}

または内蔵コンバーター

var converter = new EnumToStringConverter<EquineBeast>();

modelBuilder
    .Entity<Rider>()
    .Property(e => e.Mount)
    .HasConversion(converter);
26
szydzik

これは、次の回答と同じ質問です EF7は列挙型をサポートしていますか?

2
schnitty