web-dev-qa-db-ja.com

ASP.NET Core 2.0でDbContextを解決できません

まず、データベースにサンプルデータをシードしようとしています。私はこれがそれを行う方法であることを読みました(Startup.Configure)()を参照してください ASP.NET Core RC2 Seedデータベース

ASP.NET Core 2.0をデフォルトのオプションで使用しています。

いつものように、DbContextConfigureServicesに登録します。しかし、その後、Startup.Configureメソッドで、GetRequiredServiceを使用して解決しようとすると、次のメッセージがスローされます。

System.InvalidOperationException: 'ルートプロバイダーからスコープサービス' SGDTP.Infrastructure.Context.SGDTPContext 'を解決できません。

このような私のスタートアップクラス:

public abstract class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<SGDTPContext>(options => options.UseInMemoryDatabase("MyDatabase"))
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();

        SeedDatabase(app);
    }

    private static void SeedDatabase(IApplicationBuilder app)
    {
        using (var context = app.ApplicationServices.GetRequiredService<SGDTPContext>())
        {
            // Seed the Database
            //... 
        }
    }
}

私は何を間違えていますか?また、これはシードデータを作成するのに最適な場所ですか?

30
SuperJMN

SGDTPContextscopedサービスとして登録し、それにアクセスしようとしていますoutsideスコープの。 SeedDatabaseメソッド内にスコープを作成するには、次を使用します。

using (var serviceScope = app.ApplicationServices.CreateScope())
{
    var context = serviceScope.ServiceProvider.GetService<SGDTPContext>();

    // Seed the database.
}

コメントでCreateScope拡張メソッドを指摘してくれた@khellangと、@ Tsengのコメントと answer EF Core 2でシードを実装する方法に感謝します。

59
Kirk Larkin

公式のASP.Net MVCコア チュートリアル を使用しているときに、シードされたデータをアプリケーションに追加するセクションでこのエラーが発生していました。短い話、これらの2行を追加

 using Microsoft.EntityFrameworkCore;
 using Microsoft.Extensions.DependencyInjection;

SeedDataクラスにそれを解決しました:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;

namespace MvcMovie.Models
{
public static class SeedData
{
    public static void Initialize(IServiceProvider serviceProvider)
    {
        using (var context = new MvcMovieContext(

           serviceProvider.GetRequiredService<DbContextOptions<MvcMovieContext>>()))
        {
            // Look for any movies.
            if (context.Movie.Any())
            {
                return;   // DB has been seeded
            }
  ...

理由はわかりませんが、これらはAlt + Enterクイックフィックスオプションに従うことで得られた2つのオプションでした。

2