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(或者我期望类采用的),但由于这是使用泛型,我不知道如何做到这一点.
有没有人有任何想法?
我不知道为什么这个信息很难找到(至少对我来说),但有一个更简单的方法来做到这一点的详细位置.
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)
我从微软的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)