web-dev-qa-db-fra.com

Impossible de résoudre DbContext dans ASP.NET Core 2.0

Tout d’abord, j’essaie d’ensemencer ma base de données avec des exemples de données. J'ai lu que c'était le moyen de le faire (dans Startup.Configure ) (voir ASP.NET Core RC2 Seed Base de données )

J'utilise ASP.NET Core 2.0 avec les options par défaut.

Comme d'habitude, j'enregistre mon DbContext dans ConfigureServices. Mais après cela, dans la méthode Startup.Configure, lorsque j'essaie de le résoudre en utilisant GetRequiredService, il renvoie le message suivant:

System.InvalidOperationException: 'Impossible de résoudre le service défini' SGDTP.Infrastructure.Context.SGDTPContext 'à partir du fournisseur racine.'

Mon cours de démarrage ressemble à ceci:

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
            //... 
        }
    }
}

Qu'est-ce que je fais mal? Aussi, est-ce le meilleur endroit pour créer des données de départ?

30
SuperJMN

Vous enregistrez SGDTPContext en tant que service scoped , puis tentez d'y accéder en dehors de d'une portée. Pour créer une étendue dans votre méthode SeedDatabase, utilisez ce qui suit:

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

    // Seed the database.
}

Nous remercions @khellang pour avoir souligné la méthode d’extension CreateScope dans les commentaires, ainsi que le commentaire de @ Tseng et réponse sur la manière de mettre en œuvre l’amorçage dans EF Core 2.

59
Kirk Larkin

Ce message d'erreur s'affiche lorsque vous suivez le noyau officiel ASP.Net MVC tutoriel , dans la section où vous êtes censé ajouter des données de base à votre application. Longue histoire courte, en ajoutant ces deux lignes

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

à la classe SeedData l'a résolu pour moi:

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
            }
  ...

Je ne peux pas vous dire le POURQUOI, mais c’est là deux des options que j’ai obtenues en suivant le Alt + Enter option de réparation rapide.

2
ojonugwa ochalifu