将实体框架中的字符串列映射到枚举

She*_*tin 20 .net c# database orm entity-framework

有没有办法将字符串列映射到实体模型中的枚举?

我在Hibernate中做过这个,但无法在EMF中弄明白.

Cru*_*lex 21

可能是一个更好的版本.

OrderStateIdentifier字段用于JSON序列化和数据库字段,而OrderState仅在代码中用于方便.

    public string OrderStateIdentifier
    {
        get { return OrderState.ToString(); }
        set { OrderState = value.ToEnum<OrderState>(); }
    }

    [NotMapped]
    [JsonIgnore]
    public OrderState OrderState { get; set; }


public static class EnumHelper
{
    /// <summary>
    /// Converts string to enum value (opposite to Enum.ToString()).
    /// </summary>
    /// <typeparam name="T">Type of the enum to convert the string into.</typeparam>
    /// <param name="s">string to convert to enum value.</param>
    public static T ToEnum<T>(this string s) where T: struct
    {
        T newValue;
        return Enum.TryParse(s, out newValue) ? newValue : default(T);
    }
}
Run Code Online (Sandbox Code Playgroud)


kro*_*ijk 13

它很难看,但是为了将枚举映射到字符串,我发现了这样的东西:

public virtual string StatusString
{
    get { return Status.ToString(); }
    set { OrderStatus newValue; 
          if (Enum.TryParse(value, out newValue))
          { Status = newValue; }
        }
}

public virtual OrderStatus Status { get; set; } 
Run Code Online (Sandbox Code Playgroud)

OrderStatus是枚举器类型,Status是枚举器,StatusString是它的字符串版本.

  • 嗯,以及如何在linq查询中使用这个假枚举?我不能写像_rep.GetAll()的东西.哪里(x => x.Status == OrderStatus.Ok) (12认同)

niv*_*978 8

您可以执行以下任一操作:

将类中的 Enum 属性装饰为文本列

[Column(TypeName = "nvarchar(50)")]
public FileTypes FileType { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者

在您的DatabaseContext课程中,覆盖OnModelCreating并添加:

modelBuilder
  .Entity<File>()
  .Property(e => e.FileType)
  .HasConversion(new EnumToStringConverter<FileTypes>());
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于 EF Core。 (3认同)