[英]Map enum EnumMember's value to column in Entity Framework
I have an enum with named fields using EnumMember.我有一个使用 EnumMember 命名字段的枚举。 I want to be able to map these properties to Entity Framework.
我希望能够将 map 这些属性添加到 Entity Framework 中。
public enum FormBasis
{
[EnumMember(Value = "Order Based")]
Order = 1,
[EnumMember(Value = "Patient Based")]
Patient = 2,
[EnumMember(Value = "HCP Based")]
HCP = 3
}
My entity looks like this我的实体看起来像这样
[Table("FormBasis")]
[Index(nameof(Name), IsUnique = true)]
public class FormBasisDto : EntityBase
{
[Column("Name", TypeName = "varchar(50)")]
public CM.FormBasis Name { get; set; }
public virtual List<FormDto> Forms { get; set; }
}
I've tried我试过了
modelBuilder.Entity<FormBasisDto>()
.Property(formBasis => formBasis.Name)
.HasConversion(fb => fb.ToString(),
fb => (CM.FormBasis)Enum.Parse(typeof(CM.FormBasis), fb));
I saved a record to my table where Name is set to Order Based.我将一条记录保存到我的表中,其中名称设置为基于订单。 The error I get says Requested value 'Order Based' was not found.
我得到的错误是找不到请求的值“基于订单”。
Is there a more specific way of mapping the enum member value?是否有更具体的方法来映射枚举成员值?
You can use StringEnumConverter
to convert Enum values to string:您可以使用
StringEnumConverter
将枚举值转换为字符串:
[Column("Name"), TypeName = "varchar(50)"]
[Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))]
public CM.FormBasis Name { get; set; }
If you need custom values for enum members, you can implement your own custom converter:如果您需要枚举成员的自定义值,您可以实现自己的自定义转换器:
public class CustomJsonConverter : JsonConverter< FormBasis>
{
public override FormBasis? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
//deserialize JSON into a FormBasis?
return FormBasisEnumHelper.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, FormBasis? value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToEnumString());
}
}
So I found a couple of converter methods a few posters put on here.所以我发现了一些转换器方法,一些海报贴在这里。 I combined this approach and registered my enum conversion as follows.
我结合了这种方法并按如下方式注册了我的枚举转换。
public static class JsonHelper
{
public static string GetEnumMemberValue<T>(this T value)
where T : struct, IConvertible
{
return typeof(T)
.GetTypeInfo()
.DeclaredMembers
.SingleOrDefault(x => x.Name == value.ToString())
?.GetCustomAttribute<EnumMemberAttribute>(false)
?.Value;
}
public static T ToEnum<T>(this string str)
where T : Enum
{
var enumType = typeof(T);
foreach (var name in Enum.GetNames(enumType))
{
var enumMemberAttribute = ((EnumMemberAttribute[])enumType.GetField(name).GetCustomAttributes(typeof(EnumMemberAttribute), true)).Single();
if (enumMemberAttribute.Value == str) return (T)Enum.Parse(enumType, name);
}
return default;
}
}
The registry in my OnModelCreating looks like this我的 OnModelCreating 中的注册表如下所示
modelBuilder.Entity<FormBasisDto>()
.Property(formBasis => formBasis.Name)
.HasConversion(fb =>
fb.GetEnumMemberValue(),
fb => fb.ToEnum<CM.FormBasis>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.