System.MissingMethodException 未找到 xxx 类型的构造函数

System.MissingMethodException Constructor on type xxx not found

我有一个generic method,这个方法会收到一个dbcontext类型。 这个通用方法应该从接收到的上下文类型和 return 中创建一个新实例。

一个 Dbcontext 示例:

  class SchoolContext:DbContext
    {

        public SchoolContext(DbContextOptions<SchoolContext> dbContextOptions):base(dbContextOptions)
        {
            
        }

        public DbSet<Branche> Branches { get; set; }
        public DbSet<Student> Students { get; set; }
    }

我尝试了什么:

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 属性 将 return 您需要的通用类型,DbContextOptions<SchoolContext>.