使用配置调用AddDbContext,但上下文类型"MyContext"仅声明一个无参数构造函数?

ca9*_*3d9 34 c# entity-framework entity-framework-core .net-core

在以下控制台应用程序(.Net core 2.0)中,scaffold-dbcontext创建了以下内容DbContext

public partial class MyContext : DbContext
{
    public virtual DbSet<Tables> Tables { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(Program.Conn); }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder) { .... }
}
Run Code Online (Sandbox Code Playgroud)

在Main()(static void Main(string[] args))中,代码如下

var services = new ServiceCollection();
var conn = configuration.GetConnectionString("MySource");
services.AddDbContext<MyContext>(o => o.UseSqlServer(conn)); // Error
Run Code Online (Sandbox Code Playgroud)

得到以下运行时错误?

使用配置调用AddDbContext,但上下文类型"MyContext"仅声明无参数构造函数.这意味着永远不会使用传递给AddDbContext的配置

Cod*_*und 62

正如错误所说,如果你配置你的MyContext通过AddDbContext那么你需要添加一个接收类型参数的构造函数DbContextOptions<MyContext>到你的MyContext类,如下所示

public MyContext(DbContextOptions<MyContext> options)
    : base(options)
{ }
Run Code Online (Sandbox Code Playgroud)

如果不这样做,ASP.Net Core将无法注入您设置的配置AddDbContext.

  • 谢谢.我认为不应该更改默认的脚手架代码.但是,现在我有另一个问题 - 我无法获取连接字符串,我在这里发布了一个问题,/sf/ask/3216369901/. (3认同)
  • 注意:这是一个部分类,因此如果您要自动生成上下文,则应将构造函数添加到第二个文件中 (3认同)
  • 现在我不能做最后的测试,因为空连接字符串,让我尝试硬编码连接字符串进行测试....是的,更改工作.谢谢. (2认同)
  • 这是为添加到`EF Core 2.0`的新`services.AddDbContextPool()`方法添加的相同构造函数. (2认同)
  • 谢谢,你的代码解决了我的问题. (2认同)