c# - first - entity framework dotnet core nuget




Impossibile risolvere DbContext in ASP.NET Core 2.0 (2)

Prima di tutto, sto provando a seminare il mio database con dati di esempio. Ho letto che questo è il modo per farlo (in Startup.Configure ) (per favore, vedi Database dei semi RC2 Core di ASP.NET )

Sto usando ASP.NET Core 2.0 con le opzioni predefinite.

Come al solito, registro il mio DbContext in ConfigureServices . Ma dopo, nel metodo Startup.Configure, quando provo a risolverlo usando GetRequiredService , esso genera questo messaggio:

System.InvalidOperationException: 'Impossibile risolvere il servizio con ambito' SGDTP.Infrastructure.Context.SGDTPContext 'dal provider principale.'

La mia classe di Startup in questo modo:

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

Che cosa sto facendo di sbagliato? Inoltre, questo è il posto migliore per creare i dati seme?


Stai registrando SGDTPContext come servizio di ambito e quindi tentando di accedervi al di fuori di un ambito. Per creare uno scopo per i tuoi scopi, puoi utilizzare la seguente soluzione:

using (var serviceScope = app.ApplicationServices.CreateScope())
{
    var context = serviceScope.ServiceProvider.GetService<SGDTPContext>();
    // Seed the database.
}

Ecco un vecchio issue Github che discute questo approccio.

Ringraziamo @khellang per aver indicato il metodo di estensione CreateScope nel suo commento.

Vedi il commento di Tseng e la answer per una spiegazione sul modo migliore per accedere ai dati di seeding in EF Core 2.


Stavo ricevendo questo errore mentre seguivo il tutorial ufficiale di ASP.Net MVC Core, nella sezione in cui si suppone che si aggiungano i dati di inizializzazione alla propria applicazione. Per farla breve, aggiungendo queste due righe

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

alla classe SeedData l' SeedData risolto per me:

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

Non posso dirvi il perché, ma queste erano due delle opzioni che ho ottenuto seguendo l'opzione di correzione rapida Alt + Enter .





asp.net-core