无法使用DI选项在AspNetCore 2.0应用程序中创建DbContext的实例

时间:2018-01-06 19:00:50

标签: c# asp.net-core entity-framework-core

根据the docs我应该使用以下语句来访问数据库中的数据(当使用非基于DI的上下文方法时,它总是很有效。)

using (Context context = new Context())
  return context.Workers.ToList()

但是,现在我正在尝试关注如何根据服务配置提供的DI来部署EF上下文the docs

public void ConfigureServices(IServiceCollection services)
{
  ...
  string connection = "...";
  services.AddDbContext<Context>(_ => _.UseSqlServer(connection));
}

这在操作数据库模式时似乎有效,但在尝试查询数据时产生错误(上面的第一个语句),因为上下文类中没有默认构造函数,如下所示。

public class Context : DbContext
{
  public Context(DbContextOptions<Context> options) : base(options) { }

  public DbSet<Worker> Workers { get; set; }

  protected override void OnModelCreating(ModelBuilder builder) { ... }
}

我是否应该在我已经拥有的那个之外引入一个无参数构造函数?或者我应该自己提供选项对​​象? (坦率地说,我期待DI自动为我提供它,所以如果我理解了这个概念,我会感到有点困惑。)

我在文档中找不到关于此特定问题的任何信息。

1 个答案:

答案 0 :(得分:1)

既然我理解了你的意思,那就完全错了:

using (Context context = new Context())
  return context.Workers.ToList();

使用依赖注入时,您不应该自己创建实例。这就是你的代码的样子:

public class HomeController : Controller
{
    private readonly Context context;

    public HomeController(Context ctx)
    {
        context = ctx;
    }

    public List<Worker> GetWorkers()
    {
        return context.Workers.ToList();
    }
}

我建议您关注this Microsoft Docs article on DI,它解释了DI以及如何在ASP.NET Core上使用它(以及配置实体框架核心)。