Актуализация (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)");
}
}
}