【问题标题】:System.MissingMethodException Constructor on type xxx not found找不到类型 xxx 的 System.MissingMethodException 构造函数
【发布时间】:2021-02-11 20:10:42
【问题描述】:

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

请问我该如何解决这个问题?

【问题讨论】:

  • 先生,您建议的解决方案是什么,适合您的时间

标签: c# generics reflection dbcontext activator


【解决方案1】:

差不多了。您只需要以 DbContextOptionsBuilder&lt;TContext&gt; 开头即可为构造函数创建 DbContextOptions&lt;SchoolContext&gt;,如下所示:

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;
}

【讨论】:

  • 非常感谢先生,这个答案帮助了我
【解决方案2】:

这不是通用的:

var optionsBuilder = new DbContextOptionsBuilder();

所以这也不能是通用的:

optionsBuilder.Options

因此,如果您有一个需要特定泛型类型作为参数的构造函数: public SchoolContext(DbContextOptions&lt;SchoolContext&gt; dbContextOptions)

...那么这意味着您没有传递此构造函数所期望的内容。所以Activator.CreateInstance 正在寻找一个构造函数,它接受optionsBuilder.Options 的任何内容(非通用选项),但它找不到。这是缺少的方法。

您需要弄清楚如何创建DbContextOptions&lt;SchoolContext&gt; 的实例。

如果你改变这个

var optionsBuilder = new DbContextOptionsBuilder();

var optionsBuilder = new DbContextOptionsBuilder&lt;SchoolContext&gt;();

那么Options 属性将返回您需要的泛型类型DbContextOptions&lt;SchoolContext&gt;

【讨论】:

  • 非常感谢先生的回答,你没事,这解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多