「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; }
}
Entity Framework Core2.1以降、EFは Value Conversions をサポートし、プロパティを別のストレージのタイプ。
特に列挙型では、提供されているEnumToStringConverter
またはEnumToNumberConverter
を使用できます。
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);
質問のタイトルのためにここに来ました。これが「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);
}
}
この解決策を試してください:
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;
}
}
現在、 EFコアは列挙型をサポートしていません 。このようなコード:
public class MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<StateEnum>(e => {...});
}
}
次のメッセージでコンパイルされません:
CS0452 C#ジェネリック型またはジェネリックメソッドでパラメーター 'TEntity'として使用するには、型が参照型である必要があります
ソリューション: 代わりに列挙クラス を使用できます
これは、 EF7は列挙型をサポートしていますか? で回答されたのと同じ質問です。
データベースの列挙値を表す列挙型(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>());