web-dev-qa-db-ja.com

EF Coreデータベースで最初にEnumを使用するにはどうすればよいですか?

「Scaffold-DbContext」コマンドを使用してDbContext /エンティティを生成するデータベースファーストアプローチでEF Coreを使用しています。

Scaffold-DbContextに、特定のfieldを特定のtableintではなくEnumを使用するコードを生成する必要がありますか?

これは、通常のEFでの使用方法です。 https://www.devu.com/cs-asp/lesson-69-mapping-enum-types-entity-properties-framework-designer/ =

この列挙型は既にコードで定義されています:

public enum StateEnum {
  Ok = 1,
  Fail = 2
}

これがScaffold-DbContextから得られるものです

public partial class Foo
{
    public int Id { get; set; }
    public int State { get; set; }
}

これは私が作成したいものです:

public partial class Foo
{
    public int Id { get; set; }
    public StateEnum State { get; set; }
}
14
Bassebus

Entity Framework Core2.1以降、EFは Value Conversions をサポートし、プロパティを別のストレージのタイプ。

特に列挙型では、提供されているEnumToStringConverterまたはEnumToNumberConverterを使用できます。

8
Dejan

EF Core 2.1の値変換は、今必要なことをしませんか?

https://docs.Microsoft.com/en-us/ef/core/modeling/value-conversions

簡単な例:

  entity.Property(e => e.MyEnumField)
            .HasMaxLength(50)
            .HasConversion(
                v => v.ToString(),
                v => (MyEnum)Enum.Parse(typeof(MyEnum),v))
                .IsUnicode(false);
18
MrKobayashi

質問のタイトルのためにここに来ました。これが「Scaffold-DbContext」で機能するかどうかはわかりませんが、DbContext(Microsoft.EntityFrameworkCore 2.0.1.0)では、列挙型要素のデフォルトの基本型がintであっても、明示的に列挙型の基本型を設定します。 Fluent APIを使用して、デフォルト値を設定することもできます(特に、enumが1で始まる場合)。

public enum StateEnum : int
{
    Ok = 1,
    Fail = 2
}

列挙型に承認されているタイプは、byte、sbyte、short、ushort、int、uint、long、またはulongです。

だから、これはこれらのどれでもうまくいくと思う。 enum(C#リファレンス)

public class MyDbContext : DbContext
{      
    protected override void OnModelCreating(ModelBuilder builder) 
    {
        builder.Entity<Foo>().Property(x => x.State).HasDefaultValue(StateEnum.Ok);
    }
}
11
A.J.Bauer

この解決策を試してください:

public enum StateEnum {
      Ok = 1,
      Fail = 2
}

public partial class Foo
{
    public int Id { get; set; }
    public int StateId { get; set; }
    public StateEnum State
    {
        get => (StateEnum)StateId;
        set => StateId = (int)value;
    }
}
3
Aliaksei Zhukau

現在、 EFコアは列挙型をサポートしていません 。このようなコード:

public class MyDbContext : DbContext
{      
    protected override void OnModelCreating(ModelBuilder builder) 
    {
        builder.Entity<StateEnum>(e => {...});
    }
}

次のメッセージでコンパイルされません:

CS0452 C#ジェネリック型またはジェネリックメソッドでパラメーター 'TEntity'として使用するには、型が参照型である必要があります

ソリューション代わりに列挙クラス を使用できます

3
Rusich

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

2
schnitty

データベースの列挙値を表す列挙型(U)とエンティティ(T)を使用できます。

public static T[] BuildEntityObjectsFromEnum<T, U>() where U: Enum where T : new()
    {
        var listObjectsToReturn = new List<T>();
        Dictionary<string, int> dictionary = Enum.GetValues(typeof(U)).Cast<U>().ToDictionary(t => t.ToString(), t =>  Convert.ToInt32(t));

        foreach (var item in dictionary)
        {
            var newObject = new T();
            Type classType = typeof(T);
            classType.GetProperties()[0].SetValue(newObject, item.Value); // Enum int id
            classType.GetProperties()[1].SetValue(newObject, item.Key); // Enum string value
            listObjectsToReturn.Add(newObject);
        }
        return listObjectsToReturn.ToArray();
    }

次に、enumからテーブルをシードできます

modelBuilder.Entity<T>().HasData(BuildEntityObjectsFromEnum<T,U>());
0
sofsntp