gpt4 book ai didi

c# - 在 EF 中使用枚举类

转载 作者:行者123 更新时间:2023-12-03 23:22:52 25 4
gpt4 key购买 nike

我正在使用基于 this 的枚举类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; }
}

我正在使用 EF 7 RC1。

最佳答案

对于那些使用 遇到这个引用良好的线程的人英孚核心 ,我通常使用类型转换将自定义类型枚举按其值(又名标识符)存储在数据库中。这个扩展方法可以在方法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 Bogard 的链接文章提供的。

关于c# - 在 EF 中使用枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37513374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com