J'ai vu quelques-uns des exemples similaires sur SO à ce sujet, mais je ne connais pas assez la langue pour voir ce que je fais mal. J'ai bricolé une démo pour en savoir plus mais j'ai du mal à ensemencer ma base de données.base de données de base ASP.NET Core 2
Je reçois l'erreur suivante:
InvalidOperationException: Cannot resolve scoped service 'demoApp.Models.AppDbContext' from root provider.
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(Type serviceType, ServiceProvider serviceProvider)
Voici les trois dossiers en question:
Modèles/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; }
}
Modèles/DBInitializer.cs
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 => {...});
}
Quelqu'un peut-il aider à expliquer ce que je fais mal et comment remédier à la situation?
Pourquoi modifier 'Main'? Y at-il une référence où il est mentionné que cela est préférable? –
I Il le mentionne dans l'article lié juste en dessous du code ci-dessus. "Dans les tutoriels plus anciens, vous pouvez voir un code similaire dans la méthode Configure dans Startup.cs. Nous vous recommandons d'utiliser la méthode Configure uniquement pour configurer le pipeline de requête.Le code de démarrage de l'application appartient à la méthode Main." – palehorse
NB: L'instruction using suivante doit être disponible pour que la méthode CreateScope soit disponible: 'using Microsoft.Extensions.DependencyInjection;'. – JohnLBevan