我正在尝试通过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
方法使用错误吗?
答案 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;
}
}
是我在项目中正在做的事情。