我能够将枚举作为字符串存储在数据库中。
builder.Entity<Company>(eb =>
{
eb.Property(b => b.Stage).HasColumnType("varchar(20)");
});
但是,当需要查询时,EF并不知道将字符串解析为枚举。我怎么能这样查询:
context
.Company
.Where(x => x.Stage == stage)
这是一个例外:转换varchar值时转换失败&#39;机会&#39;到数据类型int
答案 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?