Актуализация (EF Core 3.x):
Все още няма публичен начин за получаване на EntityTypeBuilder
, но поне аргументът на конструктора е модифициран да бъде IMutableEntityType
тип, така че само
using Microsoft.EntityFrameworkCore.Metadata.Builders;
е необходим и съответният код сега е
var entityTypeBuilder = new EntityTypeBuilder(entityType);
Оригинал (EF Core 2.x):
Проблемът е, че ClrType
не е достатъчно за идентифициране на притежавания тип обект, следователно modelBuilder.Entity(Type)
не може да се използва за получаване на EntityTypeBuilder
екземпляр, необходим за плавно конфигуриране на свойствата на обекта.
Изглежда, че няма добра публика начин да направите това в EF Core 2.x, така че всичко, което мога да предложа, е да използвате някои от вътрешните елементи на EF Core (за щастие публично достъпен под типичното вътрешно предупреждение за употреба).
Ще ви трябва следното using
s:
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
Първият е за EntityTypeBuilder
клас, вторият е за AsEntityType()
метод на разширение, който ви дава достъп до вътрешния клас, имплементиращ IEntityType
и по-специално Builder
собственост.
Модифицираният код изглежда така:
var entityTypes = modelBuilder.Model.GetEntityTypes()
.ToList();
foreach (var entityType in entityTypes)
{
var properties = entityType
.GetProperties()
.ToList();
// (1)
var entityTypeBuilder = new EntityTypeBuilder(entityType.AsEntityType().Builder);
foreach (var property in properties)
{
if (property.PropertyInfo == null)
{
continue;
}
if (property.PropertyInfo.PropertyType.IsBoolean())
{
entityTypeBuilder // (2)
.Property(property.Name)
.HasConversion(new BoolToZeroOneConverter<short>())
.HasColumnType("tinyint(1)");
}
}
}