2017-08-25 113 views
5

我想获取DbContext的一个实例(所以我可以在启动时做一些额外的工作),当尝试获取实例时遇到以下错误配置方法:ASP.NET Core 2 +获取数据库上下文的实例

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

我可以通过控制器访问的细的DbContext实例等

+1

您可以添加依赖到配置方法,它们会自动得到解决。尝试将签名更改为public void Configure(IApplicationBuilder应用程序,IHostingEnvironment env,MyDbContext dbContext) –

回答

7

保罗海尔斯的评论是正确的,但这种方法更好地工作在.NET 1.0的核心。

在ASP.NET Core 2.0中,在Startup.cs中运行任何数据库设置通常是一个坏主意。这是因为如果您从CLI或Visual Studio运行任何迁移,它将运行所有Startup.cs并尝试运行您的配置,从而导致失败。当然,如果你不使用实体框架,那么这不是一个问题,但它仍然不是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(); 
}