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