如何通过反射加载所有Entity Framework 4.1实体配置实体?

Kal*_*exx 4 c# reflection entity-framework

在我的OnModelCreating数据上下文方法中,我目前手动映射所有实体配置映射类,如:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new UserMap());
    // 20 or so mapping configuration below
}
Run Code Online (Sandbox Code Playgroud)

我想通过使用反射来简化这一点,所以我有以下代码:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Find all EntityTypeConfiguration classes in the assembly
        foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
            foreach (Type t in asm.GetTypes())
                if (t.IsDerivedFromOpenGenericType(typeof(EntityTypeConfiguration<>)))
                    modelBuilder.Configurations.Add(Activator.CreateInstance(t));   
    }
Run Code Online (Sandbox Code Playgroud)

IsDerivedFromOpenGenericType是从这个问题,并正常工作.

问题是这不能编译,因为Activator.CreateInstance(t)返回一个object,但模型构建器期望a System.Data.Entity.ModelConfiguration.ComplexTypeConfiguration<TComplexType>.

通常在使用Activator类时我会将对象转换为我期望的类型t(或者我期望类采用的),但由于这是使用泛型,我不知道如何做到这一点.

有没有人有任何想法?

im1*_*ike 7

我不知道为什么这个信息很难找到(至少对我来说),但有一个更简单的方法来做到这一点的详细位置.

public class MyDbContext : DbContext
{
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Configurations.AddFromAssembly(Assembly.GetAssembly(GetType())); //Current Assembly
    base.OnModelCreating(modelBuilder);
  }
}
Run Code Online (Sandbox Code Playgroud)


Lat*_*ior 5

我从微软的Rowan Miller那里得到了这个:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {

        var addMethod = typeof (ConfigurationRegistrar)
            .GetMethods()
            .Single(m =>
                    m.Name == "Add" &&
                    m.GetGenericArguments().Any(a => a.Name == "TEntityType"));

        var assemblies = AppDomain.CurrentDomain
            .GetAssemblies()
            .Where(a => a.GetName().Name != "EntityFramework");

        foreach (var assembly in assemblies)
        {
            var configTypes = assembly
                .GetTypes()
                .Where(t => t.BaseType != null &&
                            t.BaseType.IsGenericType &&
                            t.BaseType.GetGenericTypeDefinition() == typeof (EntityTypeConfiguration<>));

            foreach (var type in configTypes)
            {
                var entityType = type.BaseType.GetGenericArguments().Single();

                var entityConfig = assembly.CreateInstance(type.FullName);
                addMethod.MakeGenericMethod(entityType)
                    .Invoke(modelBuilder.Configurations, new[] {entityConfig});
            }
        }

        base.OnModelCreating(modelBuilder);
    }
Run Code Online (Sandbox Code Playgroud)