我有一个generic method
,这个方法将接收一个dbcontext
类型。这个泛型方法应该从接收到的上下文类型创建一个新实例并返回它。
a Dbcontext示例:
class SchoolContext:DbContext
{
public SchoolContext(DbContextOptions<SchoolContext> dbContextOptions):base(dbContextOptions)
{
}
public DbSet<Branche> Branches { get; set; }
public DbSet<Student> Students { get; set; }
}
What i tried:
public static TContext GetInstance<TContext>(string connectionString) where TContext:DbContext
{
var optionsBuilder = new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(connectionString);
TContext context = Activator.CreateInstance(typeof(TContext), optionsBuilder.Options) as TContext;
return context;
}
错误:
System.MissingMethodException: 'Constructor on type 'SchoolContext' not found.'
请问如何解决这个问题?
差不多了。您只需要从DbContextOptionsBuilder<TContext>
开始,为构造器创建DbContextOptions<SchoolContext>
,如下所示:
public static TContext GetInstance<TContext>(string connectionString) where TContext : DbContext
{
var optionsBuilder = new DbContextOptionsBuilder<TContext>();
optionsBuilder.UseSqlServer(connectionString);
TContext context = (TContext)Activator.CreateInstance(typeof(TContext), optionsBuilder.Options);
return context;
}
这不是通用的:
var optionsBuilder = new DbContextOptionsBuilder();
所以这也不能是通用的:
optionsBuilder.Options
如果你有一个构造函数需要一个特定的泛型类型作为参数:public SchoolContext(DbContextOptions<SchoolContext> dbContextOptions)
…那就意味着你没有传递这个构造函数所期望的东西。所以Activator.CreateInstance
正在寻找一个构造函数,无论optionsBuilder.Options
是什么(非泛型选项),但它找不到一个。这是缺少的方法。
您需要弄清楚如何创建DbContextOptions<SchoolContext>
的实例。
如果你改变这个
var optionsBuilder = new DbContextOptionsBuilder();
var optionsBuilder = new DbContextOptionsBuilder<SchoolContext>();
则Options
属性将返回您需要的泛型DbContextOptions<SchoolContext>
。