简体   繁体   English

Map 枚举 EnumMember 的值到实体框架中的列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM