系统.未找到xxx类型的构造函数



我有一个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>

相关内容

  • 没有找到相关文章

最新更新