【问题标题】:modelBuilder.Configurations.AddFromAssembly in EF CoreEF Core 中的 modelBuilder.Configurations.AddFromAssembly
【发布时间】:2019-01-21 09:17:04
【问题描述】:

EntityFramework 6.x 中,如果我们有很多EntityConfiguration 类,那么我们可以将它们全部分配在OnModelCreating(ModelBuilder modelBuilder) 中,如下所示,而不是一一分配:

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

   modelBuilder.Configurations.AddFromAssembly(typeof(MyDbContext).Assembly);
}

有没有类似 modelBuilder.Configurations.AddFromAssembly Entity Framework Core.

【问题讨论】:

标签: c# asp.net-core entity-framework-core ef-core-2.1


【解决方案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
}

谢谢。

【讨论】:

  • modelBuilder.ApplyConfigurationsFromAssembly(typeof(UserConfiguration).Assembly); 似乎有点尴尬,必须在程序集中使用任意类来确定要使用哪个程序集(在本例中使用 UserConfiguration 类)。假设配置类和派生的 DbContext 类在同一个程序集中,是否有任何理由更喜欢 .modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly); 的这种处理方式? typeof(&lt;configuration class&gt;)this.GetType() 快吗?
  • 对于2019年12月发布的EF Core 3.1,命令行必须是modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
  • 谢谢!您的帖子非常有帮助 - 我们需要将 2.2 降级到 2.1(因为 2.2 不支持)并使用了您的方法 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2020-03-29
相关资源
最近更新 更多