Database di semi di ASP.NET Core 2

Ho visto alcuni esempi simili su SO per quanto riguarda questo, ma non ne so abbastanza sulla lingua ancora per vedere cosa sto facendo male. Ho messo insieme una demo per saperne di più, ma ho problemi a creare il mio database.

Ricevo il seguente errore:

InvalidOperationException: imansible risolvere il servizio con ambito ‘demoApp.Models.AppDbContext’ dal provider root.

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

Ecco i tre file in questione:

Modelli / AppDbContext.cs

public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } public DbSet Products{ get; set; } public DbSet Categories { get; set; } } 

Modelli / DBInitializer.cs

 public static class DbInitializer { public static void Seed(IApplicationBuilder applicationBuilder) { //I'm bombing here AppDbContext context = applicationBuilder.ApplicationServices.GetRequiredService(); if (!context.Products.Any()) { // Add range of products } context.SaveChanges(); } private static Dictionary _categories; public static Dictionary 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(); services.AddTransient(); services.AddDbContext(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 => {...}); } 

Qualcuno può aiutare a spiegare cosa sto facendo male e come rimediare alla situazione?

In ASP.NET Core 2.0 sono consigliate le seguenti modifiche. (Seeding in startup.cs funziona per Core 1.x. Per 2.0 andare in Program.cs, modificare il metodo Main per eseguire quanto segue all’avvio dell’applicazione: Ottenere un’istanza di contesto del database dal contenitore di input delle dipendenze. ad esso il contesto. Disponi il contesto quando viene eseguito il metodo seed (ecco un esempio dal sito 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(); DbInitializer.Seed(context);//< ---Do your seeding here } catch (Exception ex) { var logger = services.GetRequiredService>(); logger.LogError(ex, "An error occurred while seeding the database."); } } host.Run(); } 

Aggiornamento dalla risposta originale:

Per .NET Core 2.0, controlla questa risposta

Risposta originale:

Non sono nemmeno esperto di .NET Core, ma questa potrebbe essere la soluzione.

In DBInitializer.cs

  public static void Seed(IApplicationBuilder applicationBuilder) { using (var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService() .CreateScope()) { AppDbContext context = serviceScope.ServiceProvider.GetService(); if (!context.Products.Any()) { // Seed Here } context.SaveChanges(); } } 

L’errore suggerisce che il contesto dovrebbe essere ambito.

Inoltre, se non lo hai già fatto, darei un’occhiata all’introduzione dell’invio delle dipendenze nel documento ASP.NET Core , ma più specificamente alla sezione Durata dei servizi e opzioni di registrazione .