EF Core 2.0 Enums stored as string

Brad Firesheets picture Brad Firesheets · Dec 8, 2017 · Viewed 14.7k times · Source

I was able to store an enum as a string in the database.

builder.Entity<Company>(eb =>
{
    eb.Property(b => b.Stage).HasColumnType("varchar(20)");
});

But when it comes time to query EF doesn't know to parse the string into an enum. How can I query like so:

context
    .Company
        .Where(x => x.Stage == stage)

This is the exception: Conversion failed when converting the varchar value 'Opportunity' to data type int

Answer

szydzik picture szydzik · May 29, 2018

Value Conversions feature is new in EF Core 2.1.

Value converters allow property values to be converted when reading from or writing to the database. This conversion can be from one value to another of the same type (for example, encrypting strings) or from a value of one type to a value of another type (for example, converting enum values to and from strings in the database.)

public class Rider
{
    public int Id { get; set; }
    public EquineBeast Mount { get; set; }
}

public enum EquineBeast
{
    Donkey,
    Mule,
    Horse,
    Unicorn
}

You can use own conversion

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Rider>()
        .Property(e => e.Mount)
        .HasConversion(
            v => v.ToString(),
            v => (EquineBeast)Enum.Parse(typeof(EquineBeast), v));
}

or Built-in converter

var converter = new EnumToStringConverter<EquineBeast>();

modelBuilder
    .Entity<Rider>()
    .Property(e => e.Mount)
    .HasConversion(converter);