Aktualizacja (EF Core 3.x):
Nadal nie ma publicznego sposobu na uzyskanie EntityTypeBuilder
, ale przynajmniej argument konstruktora został zmodyfikowany na IMutableEntityType
wpisz, więc tylko
using Microsoft.EntityFrameworkCore.Metadata.Builders;
jest potrzebny, a odpowiedni kod jest teraz
var entityTypeBuilder = new EntityTypeBuilder(entityType);
Oryginał (EF Core 2.x):
Problem polega na tym, że ClrType
nie wystarczy, aby zidentyfikować typ posiadanej jednostki, stąd modelBuilder.Entity(Type)
nie można użyć do uzyskania EntityTypeBuilder
instancja potrzebna do płynnej konfiguracji właściwości jednostki.
Wygląda na to, że nie ma dobrego publicznego sposób na zrobienie tego w EF Core 2.x, więc wszystko, co mogę zasugerować, to użyć niektórych wewnętrznych EF Core (na szczęście publicznie dostępne pod typowym ostrzeżeniem dotyczącym użytkowania wewnętrznego).
Potrzebujesz następującego using
s:
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
Pierwszy dotyczy EntityTypeBuilder
druga jest dla AsEntityType()
metoda rozszerzająca, która daje dostęp do wewnętrznej klasy implementującej IEntityType
, a w szczególności Builder
właściwość.
Zmodyfikowany kod wygląda tak:
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)");
}
}
}