web-dev-qa-db-fra.com

Ajouter une implémentation de 'IDesignTimeDbContextFactory <ServicesDbContext>' à l'erreur de projet lors de la création d'une étape de migration dans .NET Core 2.0

J'avais une application Web .NET core 1.0 qui fonctionnait bien. J'ai dû passer à .NET Core 2.0. J'ai également dû ajouter une étape de migration pour ma base de données SQLite. 

Si je lance cette commande:

Add-Migration MyMigrationStepName

Je reçois cette erreur:

Impossible de créer un objet de type 'ServicesDbContext'. Ajouter un implémentation de 'IDesignTimeDbContextFactory' vers le projet ou consultez https://go.Microsoft.com/fwlink/?linkid=851728 pour modèles supplémentaires pris en charge au moment de la conception.

J'ai vu beaucoup de réponses sur SO et sur d'autres blogs et sites Web, mais aucune d'entre elles ne dit en fait où implémenter une telle interface et quel code la méthode concrète devrait contenir!

4
Gianluca Ghettini

Échantillon :

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
}

public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
    ApplicationDbContext IDesignTimeDbContextFactory<ApplicationDbContext>.CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        optionsBuilder.UseSqlServer<ApplicationDbContext>("Server = (localdb)\\mssqllocaldb; Database = MyDatabaseName; Trusted_Connection = True; MultipleActiveResultSets = true");

        return new ApplicationDbContext(optionsBuilder.Options);
    }
}

Emplacement :

Placez cette classe où ApplicationDbContext est placé. Il sera alors automatiquement sélectionné lorsque vous utiliserez les commandes dotnet ef cli.

5
Pascal

Une solution possible à IDesignTimeDbContextFactory <> problem est la découverte/le lancement de DBContext au cours du processus d’ajout de migration . S'il ne peut pas, cette erreur est renvoyée. Cela peut se produire si vous n’avez pas de DBContext public__ sans paramètre public. Une solution consiste donc à ajouter un constructeur public sans paramètre à votre contexte.

public  class SomeDbContext: DbContext
{
    // this PUBLIC constructor  is required for Migration tool
    public SomeDbContext()
    {

    }
  // the model...
    public DbSet<PocoBla> PocoBlas { get; set; }
    ....
 }

Vous pouvez avoir une version spéciale de votre DBContext dans un projet séparé. Projet de console .netCore à des fins de génération de code de migration.

1
phil soady

Je résous le problème simplement en mettant à jour Program.cs avec le dernier modèle .NET Core 2.x:

À partir de 1.x:

using System.IO; using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore1App {
    public class Program
    {
        public static void Main(string[] args)
        {
            var Host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();

            Host.Run();
        }
    } }

To 2.x:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace AspNetCoreDotNetCore2App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

Source: https://docs.Microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

0
mejiamanuel57