在 EF Core 中应用所有 IEntityTypeConfiguration 派生类

Jar*_*red 8 c# entity-framework entity-framework-core

确实的方式任何人知道或申请从派生的所有类的实现IEntityTypeConfiguration<>DbContext在运行时?

似乎没有内置任何内容并通过以下方式手动加载每个内容:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new Table1Config())
    modelBuilder.ApplyConfiguration(new Table2Config())
    ...
    modelBuilder.ApplyConfiguration(new TableNConfig())
}
Run Code Online (Sandbox Code Playgroud)

对于具有许多表的数据库来说,这将被证明是相当乏味的。

Tan*_*jel 10

对于 EF 核心 <= 2.1

您可以按如下方式编写扩展方法:

public static class ModelBuilderExtensions
{
    public static void ApplyAllConfigurations(this ModelBuilder modelBuilder)
    {
        var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterfaces()
            .Any(gi => gi.IsGenericType && gi.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>))).ToList();

        foreach (var type in typesToRegister)
        {
            dynamic configurationInstance = Activator.CreateInstance(type);
            modelBuilder.ApplyConfiguration(configurationInstance);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在OnModelCreating如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);

   modelBuilder.ApplyAllConfigurations();
}
Run Code Online (Sandbox Code Playgroud)

对于 EF Core >= 2.2

EF Core 2.2您不需要编写任何自定义扩展方法。为此EF Core 2.2添加了ApplyConfigurationsFromAssembly扩展方法。您可以按如下方式使用它:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);

   modelBuilder.ApplyConfigurationsFromAssembly(typeof(UserConfiguration).Assembly); // Here UseConfiguration is any IEntityTypeConfiguration
}
Run Code Online (Sandbox Code Playgroud)

谢谢你。


Mat*_*ins 7

现在已内置到 EF Core 2.2 中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfigurationsFromAssembly(typeof(PersonConfiguration).Assembly);
}
Run Code Online (Sandbox Code Playgroud)


Jar*_*red 4

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    var implementedConfigTypes = Assembly.GetExecutingAssembly()
        .GetTypes()
        .Where(t => !t.IsAbstract
            && !t.IsGenericTypeDefinition
            && t.GetTypeInfo().ImplementedInterfaces.Any(i =>
                i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>)));

    foreach (var configType in implementedConfigTypes)
    {
        dynamic config = Activator.CreateInstance(configType);
        modelBuilder.ApplyConfiguration(config);
    }
}
Run Code Online (Sandbox Code Playgroud)