繁体   English   中英

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

[英]System.MissingMethodException Constructor on type xxx not found

我有一个generic method ,这个方法将接收一个dbcontext类型。 这个泛型方法应该从接收到的上下文类型创建一个新实例并返回它。

一个 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属性将返回您需要的泛型类型DbContextOptions<SchoolContext>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM