【问题标题】:Apply all IEntityTypeConfiguration derived classes in EF Core在 EF Core 中应用所有 IEntityTypeConfiguration 派生类
【发布时间】:2019-02-18 22:47:38
【问题描述】:

有谁知道在运行时将所有从IEntityTypeConfiguration<> 派生的类应用到DbContext 的方法或实现?

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

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new Table1Config())
    modelBuilder.ApplyConfiguration(new Table2Config())
    ...
    modelBuilder.ApplyConfiguration(new TableNConfig())
}

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

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    对于 EF Core

    你可以写一个扩展方法如下:

    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);
            }
        }
    }
    

    然后在OnModelCreating中如下:

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

    对于 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
    }
    

    谢谢。

    【讨论】:

      【解决方案2】:

      现在已内置到 EF Core 2.2:

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.ApplyConfigurationsFromAssembly(typeof(PersonConfiguration).Assembly);
      }
      

      【讨论】:

        【解决方案3】:
        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);
            }
        }
        

        【讨论】:

        • 对我不起作用。 modelBuilder.ApplyConfiguration(config) 不接受 object。它正在寻找IEntityTypeConfiguration&lt;TEntity&gt; 的实例。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多