В дополнение к созданию универсального BaseEntityConfiguration<TEntity>
класса, как предлагается в другом ответе, вам также необходимо вызвать универсальный ModelBuilder.ApplyConfiguration<TEntity>(IEntityTypeConfiguration<TEntity> configuration)
метод с помощью отражения.
Примерно так (нужно using System.Reflection;
):
// Can be moved to a static readonly field of the class
var applyConfigurationMethodDefinition = typeof(ModelBuilder)
.GetTypeInfo()
.DeclaredMethods
.Single(m => m.Name == "ApplyConfiguration" &&
m.IsGenericMethodDefinition &&
m.GetParameters().Length == 1 &&
m.GetParameters()[0].ParameterType.IsGenericType &&
m.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>));
foreach (var entityType in entityTypes)
{
var configurationType = typeof(BaseEntityConfiguration<>).MakeGenericType(entityType);
var configuration = Activator.CreateIntance(configurationType);
var applyConfigurationMethod = applyConfigurationMethodDefinition.MakeGenericMethod(entityType);
applyConfigurationMethod.Invoke(builder, new object[] { configuration });
}
Обратите внимание, что в EF Core 2.1 ModelBuilder
класс имеет 2 ApplyConfiguration
перегрузки метода, которые отличаются только типом параметра, поэтому поискметод включает в себя все проверки.