web-dev-qa-db-fra.com

Impossible d'ajouter une migration avec ASP.net Core 2

Je construis un nouveau projet en utilisant ASP.net Core 2 et EntityFrameWorkCore 2.1.0 et j'ai commencé à construire la structure de la base de données. Maintenant, je dois faire ma première migration pour que ma base de données soit prête et lorsque j'exécute 'Add-Migration Init' dans la console du gestionnaire de packages, j'ai l'erreur suivante: 

The current CSharpHelper cannot scaffold literals of type 'Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding'. Configure your services to use one that can.

J'ai aussi essayé cette documentation https://docs.Microsoft.com/en-us/aspnet/core/data/ef-mvc/migrations et le message que j'ai reçu est le suivant: 

Unable to create an object of type 'ApplicationDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project, or see https://go.Microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

J'ai également suivi cet article sans aucun succès.

Si j'essaie sans Microsoft.AspNetCore.Identity.EntityFrameworkCore 2.0.2 et avec une structure simple à 2 tables, je suis en mesure de le faire fonctionner.

Alors maintenant, j'ai besoin de votre aide ...

3
David Létourneau

J'ai trouvé quelques raisons pour lesquelles nous pouvons avoir du mal à utiliser la migration avec la dernière version d'ASP.net Core 2 pour le moment.

Tout d’abord, si vous migrez d’un ancien projet qui n’est pas du tout construit à partir d’ASP.net Core, vous devrez ajouter une fabrique de contexte pour que les migrations fonctionnent. Voici ma propre usine de contexte:

public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
        builder.UseSqlServer("Server=(local)\\SQLEXPRESS;Database=yourdatabase;User ID=user;Password=password;TrustServerCertificate=True;Trusted_Connection=False;Connection Timeout=30;Integrated Security=False;Persist Security Info=False;Encrypt=True;MultipleActiveResultSets=True;",
            optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(ApplicationDbContext).GetTypeInfo().Assembly.GetName().Name));

        return new ApplicationDbContext(builder.Options);
    }
}

Si vous avez divisé votre projet en couches à des fins d'architecture, ajoutez la fabrique de contexte dans la couche de référentiel ou dans la même bibliothèque que votre DbContext.

Deuxièmement, avant toute tentative d’ajout d’une migration, vous devez définir la sélection de «définir comme projet de démarrage» dans la bibliothèque du référentiel ou dans l’emplacement de votre DbContext . Il s’agit ensuite des packages à utiliser pour la migration:

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.SqlServer

C'est tout!

Soyez prudent lorsque vous ajoutez d'autres packages, car ils peuvent endommager le système de migration. Par exemple, si vous utilisez un cadre d'unité de travail et de référentiels comme URF et installez URF.Core.EF.Trackable -Version 1.0.0-rc2, vous ne pourrez plus ajouter de migration. À la place, utilisez URF.Core.EF.Trackable -Version 1.0.0-rc1. Je suppose que cela peut arriver avec beaucoup d'autres paquets aussi.

Enfin, lisez cet article sera utile. C’est un peu dépassé, mais cela peut aider les gens là-bas.

À votre santé 

6
David Létourneau

Assurez-vous que les packages NuGet requis sont installés:

  1. Microsoft.EntityFrameworkCore.SqlServer
  2. Microsoft.EntityFrameworkCore.Design
10
Jawahar 05

Comment organisez-vous la méthode principale dans "Program.cs"? Cette erreur peut être corrigée par un ancien modèle d'initialisation . À partir des instructions de migration Asp Net:

L'adoption de ce nouveau modèle 2.0 est fortement recommandée et vaut requis pour les fonctionnalités du produit telles que Entity Framework (EF) Core Les migrations au travail. Par exemple, exécuter Update-Database à partir du fichier La fenêtre de la console du gestionnaire de packages ou la mise à jour de la base de données dotnet ef à partir du fichier La ligne de commande (sur les projets convertis en ASP.NET Core 2.0) génère le fichier erreur suivante:

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

Vérifier à ce lien de la mise en œuvre correcte

0
Matteo Tosato