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

70
在下面的控制台应用程序(.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) { .... }
}
在 Main() 方法中(static void Main(string[] args)),下面的代码
var services = new ServiceCollection();
var conn = configuration.GetConnectionString("MySource");
services.AddDbContext<MyContext>(o => o.UseSqlServer(conn)); // Error

你是否遇到了以下运行时错误?

调用 AddDbContext 时使用了配置,但上下文类型“MyContext”仅声明了一个无参数构造函数。这意味着传递给 AddDbContext 的配置将永远不会被使用。

1个回答

130

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

public MyContext(DbContextOptions<MyContext> options)
    : base(options)
{ }

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


3
谢谢。我认为默认的脚手架代码不应该被更改。但是,现在我有另一个问题 - 我无法获取连接字符串,我在这里发布了一个问题:https://dev59.com/0KTja4cB1Zd3GeqPGr5K. - ca9163d9
3
现在由于空的连接字符串,我无法进行最终测试,请让我尝试硬编码连接字符串进行测试......是的,更改有效。谢谢。 - ca9163d9
3
注意:这是一个部分类,如果您正在自动生成上下文,则应将构造函数添加到第二个文件中。 - Simon_Weaver
2
这是同样的构造函数,用于添加到EF Core 2.0中新增的services.AddDbContextPool()方法。 - Simon_Weaver
1
这个添加让我的代码进展了一点,谢谢。 - JustJohn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接