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。
对于那些使用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)。这可以通过在此方法中引入缓存来摊销,吉米·博加德的链接文章没有提供这一点。
| 归档时间: |
|
| 查看次数: |
3137 次 |
| 最近记录: |