我需要在DbContext
中注册所有实体。
我创建了一个extention
,用于使用Reflection
自动注册所有实体:
public static void RegisterAllEntity<BaseType>(this DbModelBuilder builder, params Assembly[] assmblies)
{
IEnumerable<Type> types = assmblies.SelectMany(x => x.GetExportedTypes())
.Where(x => x.IsClass && !x.IsAbstract && x.IsPublic && typeof(BaseType).IsAssignableFrom(x));
foreach (Type EntityType in types)
builder.Entity<EntityType>();
}
但是它显示了这个错误:
EntityType'是一个变量,但像类型一样使用
在此行:
foreach (Type EntityType in types)
builder.Entity<EntityType>();
出什么问题了?我该如何解决这个问题?
答案 0 :(得分:2)
查看文档,我认为您想使用DbModelBuilder.RegisterEntityType
而不是DbModelBuilder.Entity
。前者的文档说:
提供此方法是为了方便,以允许动态注册实体类型,而无需使用MakeGenericMethod来调用普通的通用Entity方法。
因此,您可以使用builder.Entity<EntityType>();
而不是builder.RegisterEntityType(EntityType);
值得一提的是,在这种情况下,通常会使用一个非通用方法来代替Type
对象,因此,如果以后在其他软件中发现这种情况,请检查该非通用方法带有Type
参数的方法。
答案 1 :(得分:1)
在编译过程中,通用参数必须是可解析的。您需要在这种循环中使用反射来调用Entity
方法。请检查this答案。
用法示例
...
MethodInfo method = typeof(DbModelBuilder).GetMethod("Entity");
MethodInfo generic = method.MakeGenericMethod(EntityType);
generic.Invoke(builder, null);
编辑:
与克里斯mentioned一样,也不需要使用反射,因为DbModelBuilder
提供了RegisterEntityType方法,该方法接受Type作为参数,例如:
builder.RegisterEntityType(EntityType);
EDIT2:有克里斯(Chris)answer
答案 2 :(得分:1)
您可以在每个foreach周期中将EntityType用作变量,并在builder.Entity<EntityType>()
中将EntityType用作类型。例如,将变量名称从EntityType更改为EntityType,以便C#编译器可以理解您的代码