28

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

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

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

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

这是一个例外:将 varchar 值“机会”转换为数据类型 int 时转换失败

4

3 回答 3

70

值转换功能是 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);
于 2018-05-29T17:24:29.803 回答
11

您可以使用它将所有实体的所有属性的所有枚举转换为字符串,反之亦然:

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);
                    }
                }
            }
        }
    }
}
于 2020-05-10T14:27:37.790 回答
2

这与在以下位置回答的问题相同: EF7 是否支持枚举?

于 2018-04-19T05:16:36.750 回答