2017-08-25 9 views
5

DbContextのインスタンスを取得しようとしています(起動時に追加作業ができるように)ので、インスタンスを取得しようとすると次のエラーが表示されます。構成メソッド:ASP.NET Core 2 + dbコンテキストのインスタンスを取得する

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

Configureメソッドに依存関係を追加すると、自動的に解決されます。シグネチャをpublicに変更してみてください。void Configure(IApplicationBuilder app、IHostingEnvironment env、MyDbContext dbContext) –

答えて

7

ポールHilesコメントは正しいですが、その方法は、.NETのコア1.0でうまく機能します。

ASP.NETコア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(); 
} 
関連する問題