2017-09-14 15 views
5

私はこのことに関して同様の例をいくつか見てきましたが、私が間違っていることをまだ見ていないだけでは、言語について十分にわかりません。私はより多くのことを学ぶためにデモを一緒に作ったが、私は自分のデータベースをシードするのに困っている。ASP.NETコア2シードデータベース

私は、次のエラーが表示されます

モデル/ AppDbContext.cs

public class AppDbContext : DbContext 
{ 
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) 
    { 

    } 
    public DbSet<Product> Products{ get; set; } 
    public DbSet<Category> Categories { get; set; } 
} 

モデル/ DBInitializer.cs:ここ

InvalidOperationException: Cannot resolve scoped service 'demoApp.Models.AppDbContext' from root provider.

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, ServiceProvider serviceProvider)

は、問題の3つのファイルがあります

public static class DbInitializer 
{ 
    public static void Seed(IApplicationBuilder applicationBuilder) 
    { 
     //I'm bombing here 
     AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService<AppDbContext>(); 

     if (!context.Products.Any()) 
     { 
      // Add range of products 
     } 

     context.SaveChanges(); 
    } 

    private static Dictionary<string, Category> _categories; 
    public static Dictionary<string, Category> Categories 
    { 
     get 
     { 
      if (_categories == null) 
      { 
       // Add categories... 
      } 

      return _categories; 
     } 
    } 
} 

Startup.cs

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

public IConfiguration Configuration { get; } 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddTransient<ICategoryRepository, CategoryRepository>(); 
    services.AddTransient<IProductRepository, ProductRepository>(); 

    services.AddDbContext<AppDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddMvc(); 
} 

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

     // Kersplat! 
     DbInitializer.Seed(app); 
    } 
    else ... 

    app.UseStaticFiles(); 
    app.UseMvc(routes => {...}); 
} 

誰かが私が間違っているとどのような状況を改善するためにしていますどのような説明を助けることはできますか?オリジナル回答から

答えて

11

ASP.NET Core 2.0では、以下の変更が推奨されています。 (startup.csのSeedingはCore 1.xで動作します.2.0ではProgram.csに移動し、Mainメソッドを変更して、アプリケーションの起動時に次の処理を行います。 依存関係注入コンテナからデータベースコンテキストインスタンスを取得します。 シードメソッドを呼び出しますそれにコンテキストを渡す。 シード法が行われたときにコンテキストを処分してください。 (ここでは、Microsoftのサイトからのサンプルがあります。https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

public static void Main(string[] args) 
{ 
var host = BuildWebHost(args); 

using (var scope = host.Services.CreateScope()) 
{ 
    var services = scope.ServiceProvider; 
    try 
    { 
     var context = services.GetRequiredService<yourDBContext>(); 
     DbInitializer.Seed(context);//<---Do your seeding here 
    } 
    catch (Exception ex) 
    { 
     var logger = services.GetRequiredService<ILogger<Program>>(); 
     logger.LogError(ex, "An error occurred while seeding the database."); 
    } 
} 

host.Run(); 
} 
+0

'Main'を改造するのはなぜですか?これが好きであると言及されている参考資料はありますか? –

+1

私はあなたが提供したリンクを大変ありがとうございます。上のコードのすぐ下にリンクされた記事でそれを言及しません。 "以前のチュートリアルでは、Startup.csのConfigureメソッドで同様のコードが表示されることがありますが、Configureメソッドを使用してリクエストパイプラインを設定することをお勧めします。 – palehorse

+0

NB:CreateScopeメソッドを使用できるようにするには、using using Microsoft.Extensions.DependencyInjection;を使用する必要があります。 – JohnLBevan

2

アップデート:私は、どちらか全く.NETのコアの専門家だん

が、この:.NETのコア2.0については

は、this answer代わり

オリジナル回答をチェックあなたの解決策かもしれません。

でDBInitializer.cs

public static void Seed(IApplicationBuilder applicationBuilder) 
    { 
     using (var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService<IServiceScopeFactory>() 
       .CreateScope()) 
     { 
      AppDbContext context = serviceScope.ServiceProvider.GetService<AppDbContext>(); 

      if (!context.Products.Any()) 
      { 
       // Seed Here 
      } 

      context.SaveChanges(); 
     } 
    } 

エラーは、コンテキストがスコープされるべきであることを示唆しています。

また、まだ完了していない場合は、Introduction to Dependency Injection in ASP.NET Coreのドキュメントをご覧ください。具体的には、Service Lifetimes and Registration Optionsセクションをご覧ください。

+0

私は、データベースを更新し、期待通りのデータベースは播種、移行をreran – forcequitIO

関連する問題