まず、データベースにサンプルデータをシードしようとしています。私はこれがそれを行う方法であることを読みました(Startup.Configure)()を参照してください ASP.NET Core RC2 Seedデータベース )
ASP.NET Core 2.0をデフォルトのオプションで使用しています。
いつものように、DbContext
をConfigureServices
に登録します。しかし、その後、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
//...
}
}
}
私は何を間違えていますか?また、これはシードデータを作成するのに最適な場所ですか?
SGDTPContext
をscopedサービスとして登録し、それにアクセスしようとしていますoutsideスコープの。 SeedDatabase
メソッド内にスコープを作成するには、次を使用します。
using (var serviceScope = app.ApplicationServices.CreateScope())
{
var context = serviceScope.ServiceProvider.GetService<SGDTPContext>();
// Seed the database.
}
コメントでCreateScope
拡張メソッドを指摘してくれた@khellangと、@ Tsengのコメントと answer EF Core 2でシードを実装する方法に感謝します。
公式の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つのオプションでした。