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

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

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

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

但是,现在我正在尝试关注 the docs了解如何基于服务配置提供的 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();

在使用依赖注入(inject)时,你不应该自己创建实例。你的代码应该是这样的:

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 上使用它(以及配置 Entity Framework Core)。

关于c# - 无法使用 DI 选项在 AspNetCore 2.0 应用程序中创建 DbContext 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48130798/

相关文章:

c# - Visual Studio 运行不需要的代码

asp.net-mvc - 在 ASP.NET Core MVC 中选择 ENUM 标记帮助器

asp.net-core - 如何在 ASP.NET 5 中为静态文件启用浏览器链接

c# - Entity Framework Core - 唯一约束

c# - 如何在运行时在 Entity Framework Core 中真正定位表

c# - 重构我的 C# 代码 - Switch 语句

c# - 如何在 Xamarin.IOS 中返回到之前的 ViewController

c# - WPF 设计器错误声明当应用 StaticResource 时我的自定义 UserControl 为 "Could not create an instance of type..."

c# - 扩展 BadResult 以提供不同的 StatusCode

entity-framework-core - 锁定表 Entity Framework 核心的最佳方式