Я пытаюсь использовать EntityFrameworkCore
ORM для взаимодействия со своими базами данных. По умолчанию EntityFrameworkCore
, похоже, хранит перечисление как int вместо строки.
Однако я хотел бы сохранить значение в базе данных в виде строки. Я вижу, что EntityFrameworkCore
поставляется с конвертером под названием EnumToStringConverter.
Я пытаюсь использовать отражение для настройки построителя моделей, поэтому мне не нужно вручную создавать каждую модель.
Проблема, с которой я сталкиваюсь, заключается в том, что EnumToStringConverter
принимает общий тип, который должен быть enum
. Но поскольку я пытаюсь использовать здесь отражение, я не могу передать тип перечисления при создании преобразователя.
Вот как выглядит мой код до сих пор
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Get all DbSet<> properties that are defined in the DbContext
var modelTypes = typeof(DataContext).GetProperties()
.Where(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
.Select(x => x.PropertyType.GetGenericArguments().First())
.ToList();
foreach (Type modelType in modelTypes)
{
var properties = modelType.GetProperties();
foreach (var property in properties)
{
if (IsPrimaryKey(property))
{
// At this point we know that the property is a primary key
modelBuilder.Entity(modelType)
.Property(property.Name)
.UseSqlServerIdentityColumn()
.Metadata.BeforeSaveBehavior = PropertySaveBehavior.Ignore;
continue;
}
if (property.PropertyType.IsEnum)
{
// At this point we know that the property is an enum.
// Add the EnumToStringConverter converter to the property so that
// the value is stored in the database as a string instead of number
var converter = new EnumToStringConverter(); // if somehow I can change this code to something like var `new EnumToStringConverter(property.PropertyType);` the code would work
modelBuilder.Entity(modelType)
.Property(property.Name)
.HasConversion(converter);
continue;
}
}
}
}
Единственная проблема с приведенным выше кодом заключается в том, как EnumToStringConverter построен. Если каким-то образом я могу предоставить Type
конструктору EnumToStringConverter
вместо передачи его в качестве общего аргумента, который решит проблему.