我在域模型中使用基于Jimmy的这文章的枚举类。然而,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; }
}
我用EF 7 RC1。
发布于 2016-05-29 10:38:45
在EF6中,您可以将ReservationClass
配置为ComplexType,忽略DisplayName
属性并映射Value
属性。
据这些设计会议记录说,对你来说很不幸
在EF7的初始RTM中,我们是而不是,我们计划启用复杂的和/或值类型。
换句话说,您不能在当前的EF核心中这样做。
发布于 2020-05-13 01:41:37
对于使用EF核心遇到这个引用良好的线程的线程,我通常使用类型转换将自定义类型枚举按其值(又名标识符)存储在数据库中。此扩展方法可用于方法OnModelCreating
(或实现IEntityTypeConfiguration<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));
}
}
之后,可以将枚举属性配置为:
internal class SpecimenConfiguration : IEntityTypeConfiguration<Specimen>
{
public void Configure(EntityTypeBuilder<Specimen> builder)
{
builder.OwnEnumeration(x => x.Type);
}
}
这种方法的好处在于它只存储标识符(而不是附加到给定的Enumeration
派生类的其他属性),并且支持Enumeration
的子类。
缺点是通过Enumeration.FromId<TEnum>(x)
大量使用反射。这可以通过在此方法中引入缓存来摊销,Jimmy的链接文章没有提供缓存。
发布于 2020-10-20 20:22:00
对于那些使用EF核心3.1的人来说,有更好的方法来做到这一点。目标是拥有一个具有列出的枚举的数据库表。
(1)定义枚举表的外观:
public virtual DbSet<ReservationStatus> ReservationStatuses { get; set; }
public void Configure(EntityTypeBuilder<ReservationStatus> builder)
{
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).HasDefaultValue(1).ValueGeneratedNever().IsRequired();
builder.Property(x => x.Name).IsRequired();
}
(2)定义保留实体中的值是如何关联的
public void Configure(EntityTypeBuilder<Reservation> builder)
{
builder.Property(x => x.ReservationStatusId).IsRequired();
builder.HasOne(x => x.ReservationStatus)
.WithMany()
.HasForeignKey(x => x.ReservationStatusId);
}
(3)枚举表的种子
if (!await RevervationSatuses.AnyAsync())
{
RevervationSatuses.AddRange(Enumeration.GetAll<RevervationSatus>());
await SaveChangesAsync();
}
https://stackoverflow.com/questions/37513374
复制相似问题