通过使用DbContextOptions的配置获取DbContext

时间:2019-03-31 20:48:41

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

我正在尝试通过DbContext在项目的服务提供者上注册我使用的选项services.AddDbContext(...),但是在调用configuration.Get<ModelContext>时无法构建选项,因为选项显然不是没有提供,因此也没有提供数据库提供程序。

我将ASP.NET Core 2.2与Entity Framework Core 2.2.3结合使用,而我的DbContext是在一个单独的项目中定义的。

我的DbContext

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

    public ModelContext() { }
}    

我没有覆盖OnConfiguring(DbContextOptionsBuilder)中的ModelContext

public class StartUp
{
    public void ConfigureServices(IServiceCollection services)
    {
        public services.AddEntityFrameworkSqlServer();
        services.AddDbContext<ModelContext>(options => options.UseSqlServer(modelConnectionString));
    }
}

在控制器中(或实际上在任何地方),我调用public HomeController(IConfiguration configuration) => _modelContext = configuration.Get<ModelContext>();会引发意外的异常。

我特别得到的是带有消息的InvalidOperationException

  

尚未为此DbContext配置数据库提供程序。可以通过重写DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。如果使用AddDbContext,则还请确保您的DbContext类型在其构造函数中接受DbContextOptions对象,并将其传递给DbContext的基本构造函数。

根据我阅读的文档和查看的示例,应该使用调用ModelContext时定义的选项来创建AddDbContext<ModelContext>Get方法使用错误吗?

2 个答案:

答案 0 :(得分:1)

在Startup.cs文件的“ ConfigureServices”方法中配置数据库上下文服务后,如下所示:

var connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<BottinContext>(options => options.UseSqlServer(connectionString)) ;

只需添加一个:

ModelContext db

控制器构造函数的参数,让DI魔术发生。

如果您有许多控制器并且希望简化操作,则可以使用一个具有db上下文的基本构造器

  public BaseController(ModelContext context /* as well as other injections */)
    {
      _db = context;
    }
    internal ModelContext _db;

答案 1 :(得分:0)

您试图以错误的方式获取dbContxt实例。 Get方法不用于获取您在依赖项注入容器中注册的dbContext对象的实例。 如果要获取注册的dbContext类的实例,可以通过构造注入将其注入,例如

public class RepositoryWrapper : IRepositoryWrapper
{
        private readonly ModelContext _modelContext;


        public RepositoryWrapper(ModelContext modelContext)
        {
        _modelContext= modelContext;
        }
}

是我在项目中正在做的事情。