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



根据文档,我应该使用以下语句来访问数据库中的数据(使用非基于DI的上下文方法时,这总是很好用(。

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

但是,现在我正在尝试按照文档了解如何基于服务配置提供的 DI 部署 EF 上下文,如下所示。

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 自动为我提供它,所以如果我正确理解了这个概念,我会感到有点困惑。

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

现在我明白了你的意思,这是完全错误的:

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

我建议您关注这篇关于 DI 的Microsoft文档文章,其中介绍了 DI 以及如何在 ASP.NET Core 上使用它(以及配置实体框架核心(。

最新更新