EF Core 2.0枚举存储为字符串

时间:2017-12-08 19:50:13

标签: entity-framework ef-core-2.0

我能够将枚举作为字符串存储在数据库中。

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

但是,当需要查询时,EF并不知道将字符串解析为枚举。我怎么能这样查询:

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

这是一个例外:转换varchar值时转换失败&#39;机会&#39;到数据类型int

3 个答案:

答案 0 :(得分:19)

价值转化功能是EF Core 2.1中的新功能。

  

值转换器允许在读取时转换属性值   来自或写入数据库。此转换可以来自一个值   到另一个相同类型(例如,加密字符串)或从   一种类型的值到另一种类型的值(例如,   将枚举值转换为数据库中的字符串。)

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

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

您可以使用自己的转化

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

或内置转换器

var converter = new EnumToStringConverter<EquineBeast>();

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

答案 1 :(得分:5)

您可以使用此方法将所有实体的所有属性的所有Enum转换为字符串,反之亦然:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using System;

namespace MyApp
{
    public class DatabaseContext : DbContext
    {
        public DbSet<UserContext> Users { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // Configure your model here
        }

        protected override void OnModelCreating(ModelBuilder model)
        {
            foreach (var entityType in model.Model.GetEntityTypes())
            {
                foreach (var property in entityType.GetProperties())
                {
                    if (property.ClrType.BaseType == typeof(Enum))
                    {
                        var type = typeof(EnumToStringConverter<>).MakeGenericType(property.ClrType);
                        var converter = Activator.CreateInstance(type, new ConverterMappingHints()) as ValueConverter;

                        property.SetValueConverter(converter);
                    }
                }
            }
        }
    }
}

答案 2 :(得分:2)

这是与以下答案相同的问题: Does EF7 support enums?