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