我正在尝试获取DbContext的实例(以便在启动时可以做一些额外的工作),尝试在Configure方法中获取实例时出现以下错误:
System.InvalidOperationException:'无法从根提供程序解析作用域服务'MyApp.Data.MyDbContext'。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(
options => options.UseSqlServer(Configuration.GetConnectionString("MyDbContext")));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var dbContext = app.ApplicationServices.GetService(typeof(MyDbContext)) as MyDbContext;
}
我可以通过 Controller 等访问DbContext的实例
最佳答案
Paul Hiles的评论是正确的,但该方法在.NET Core 1.0中效果更好。
在ASP.NET Core 2.0中,通常不建议在Startup.cs
中运行任何数据库设置。这是因为如果您从CLI或Visual Studio运行任何迁移,它将运行所有Startup.cs
并尝试运行配置,这将失败。当然,如果您不使用 Entity Framework ,那么这不是问题,但是仍然不是在2.0中推荐的方法。现在建议使用Program.cs
进行操作。
例如,您可以创建IWebHost
的扩展方法,该方法将运行所需的任何设置。
public static IWebHost MigrateDatabase(this IWebHost webHost)
{
var serviceScopeFactory = (IServiceScopeFactory)webHost.Services.GetService(typeof(IServiceScopeFactory));
using (var scope = serviceScopeFactory.CreateScope())
{
var services = scope.ServiceProvider;
var dbContext = services.GetRequiredService<YourDbContext>();
dbContext.Database.Migrate();
}
return webHost;
}
然后在
Program.cs
中,您可以在运行之前调用该方法。public static void Main(string[] args)
{
BuildWebHost(args)
.MigrateDatabase()
.Run();
}
关于c# - ASP.NET Core 2 +获取数据库上下文实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45885019/