在 EF 中使用枚举类

Hel*_* me 4 c# enums entity-framework-core

我在域模型中使用基于Jimmy Bogard 的这篇文章的枚举类。但是,EF 将类视为实体并希望定义一个键。

有没有办法让 EF 存储枚举类中的值,就像使用标准 C# 枚举一样?

这就是我目前实现枚举类的方式:

public class ReservationStatus : Enumeration
{
    public static readonly ReservationStatus Outstanding = new ReservationStatus(0, "Oustanding");
    public static readonly ReservationStatus Paid = new ReservationStatus(1, "Paid");
    public static readonly ReservationStatus Canceled = new ReservationStatus(2, "Canceled");
    public static readonly ReservationStatus Rejected = new ReservationStatus(3, "Rejected");

    private ReservationStatus() { }
    private ReservationStatus(int value, string displayName) : base(value, displayName) { }
}

public class Reservation : Entity<int>
{
    public ReservationStatus Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 EF 7 RC1。

Zen*_*ulz 8

对于那些使用EF Core遇到这个引用良好的线程的人,我通常使用类型转换按其值(也称为标识符)在数据库中存储自定义类型枚举。该扩展方法可以在方法(或实现 的类)中使用:OnModelCreatingIEntityTypeConfiguration<T>

internal static class EnumerationConfiguration
{
    public static void OwnEnumeration<TEntity, TEnum>(this EntityTypeBuilder<TEntity> builder,
        Expression<Func<TEntity, TEnum>> property)
        where TEntity : class
        where TEnum : Enumeration
    {
        builder
            .Property(property)
            .HasConversion(x => x.Id, x => Enumeration.FromId<TEnum>(x));
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,可以按如下方式配置枚举属性:

internal class SpecimenConfiguration : IEntityTypeConfiguration<Specimen>
{
    public void Configure(EntityTypeBuilder<Specimen> builder)
    {
        builder.OwnEnumeration(x => x.Type);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是它只存储标识符(而不存储附加到 的给定派生类的其他属性Enumeration)并支持 的子类化Enumeration

缺点是大量使用反射Enumeration.FromId<TEnum>(x)。这可以通过在此方法中引入缓存来摊销,吉米·博加德的链接文章没有提供这一点。