12
votes

Impossible de créer un objet de type '[DBContext's Name]'. Pour les différents modèles pris en charge au moment de la conception

Je suis l'un des cours Mosh Hamedani sur ASP.NET MVC dans Udemy.

Je suis tombé sur une erreur lors de la conception de ma base de données en utilisant le code d'abord (Entity Framework).

Au début, j'ai eu l'erreur "Aucun DbContext n'a été trouvé dans l'assemblage" . Après avoir résolu ce problème, un autre est sorti de nulle part.

L'image ci-dessous vous montrera l'erreur trouvée lors de l'ajout d'une migration. J'ai déjà recherché la même erreur mais en vain. Je me bats depuis deux heures mais rien n'est résolu jusqu'à présent.

S'il vous plaît, quelqu'un, aidez-moi. Merci

impossible de créer un objet de type 'Vidly_Context'. Pour les différents modèles pris en charge au moment du design, voir https://go.microsoft.com/fwlink/?linkid=851728


4 commentaires

avez-vous lu le lien donné?


Oui, ça marche maintenant. Un morceau de code C # devait être ajouté au fichier de démarrage


@OoMaRjOhUr vous pouvez ajouter une réponse indiquant le code que vous avez ajouté pour que cela fonctionne, puis accepter cette réponse. Cela pourrait aider quelqu'un à l'avenir.


Oui, pourquoi @OoMaRjOhUr n'ajoute pas la réponse pour que le reste puisse la voir?


12 Réponses :


14
votes

J'ai rencontré ce problème lors de l'utilisation de migrations EF Core code-first dans une solution .NET Core 3 qui contenait à la fois un projet MVC et un projet Blazor.

Si le projet de démarrage de la solution est défini sur le projet Blazor, j'obtiens l'erreur lors de l'utilisation d' add-migration , mais je ne le fais pas si le projet de démarrage est défini sur le projet MVC.

En lisant la page de documentation liée par le message d'erreur et en comparant le code dans les fichiers startup.cs pour les deux projets, je ne sais pas pourquoi cela serait, mais le basculement temporaire du projet de démarrage vers le projet MVC le corrige pour moi.


0 commentaires

15
votes

1- Assurez-vous de définir votre projet Web comme Set as Startup Project

2- Dans la console du gestionnaire de packages , définissez votre couche d'accès aux données (le cas échéant) comme projet par défaut

3- Puis relancez la commande


1 commentaires

Il convient de mentionner que si vous utilisez Rider où vous n'avez pas de "Définir comme projet de démarrage", vous pouvez utiliser --startup-project sur la commande



6
votes

J'ai rencontré le même problème. OP a mentionné qu'ils devaient ajouter du code à leur Startup.cs.

Sur https://go.microsoft.com/fwlink/?linkid=851728, il y a l'exemple de code suivant;

services.AddDbContext<ApplicationDbContext>();

Mon code manquait ce qui suit dans ma méthode ConfigureServices;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();
}

Après avoir ajouté cela pour mon contexte de base de données, le problème a été résolu.


0 commentaires

2
votes

Dans le fichier de démarrage Méthode ConfigureServices

services.AddDbContextPool<contextName>(
                    options => options.UseSqlServer(Configuration.GetConnectionString("conString")));


1 commentaires

J'utilise exactement cela, mais j'obtiens toujours l'erreur



4
votes

J'ai eu cette erreur car une virgule manquait dans mon appsettings.json

{
  "ConnectionStrings": {
    "DefaultCoonection": "Data Source=Leonardo-Notebook;Initial Catalog=MyDB;Integrated Security=True"
  } <- Comma missing here
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}


1 commentaires

J'ai eu un problème similaire à celui-ci. À titre de suggestion, assurez-vous que votre programme s'exécute, ou au moins démarre avant d'essayer de résoudre le problème "add-migrations"



7
votes

Le message d'erreur indique que le contexte n'a pas pu être créé au moment du design. Si vous spécifiez dans la commande de migration le projet de démarrage avec l'indicateur --startup-project (ou -s), vous pouvez aider la commande à créer l'instance de contexte au moment de la conception d'une manière similaire à la façon dont elle serait créée au moment de l'exécution.

Par exemple:

cd ./project_with_migrations_folder
dotnet ef --startup-project ../my_startup_project_path/ migrations add myMigration01


1 commentaires

Mis à jour. La deuxième commande est un exemple de commande de migration avec l'indicateur de projet de démarrage spécifié. Devrait fonctionner avec n'importe quelle commande de migration. L'OMI est une meilleure approche que les réponses existantes car elle ne nécessite pas de changer votre code



0
votes

c'est l'un des problèmes les plus absurdes que vous ayez jamais rencontrés avec ASP.NET Core. Je ne suis pas vraiment sûr du cours que vous avez mentionné, mais si votre application est comme la mienne où la couche de présentation est séparée de la couche de données; assurez-vous que vous installez la dernière version de Microsoft.EntityFrameworkCore.Design sur votre couche de présentation aussi "votre projet de démarrage". Il est obligatoire et le message d'erreur n'en dit rien.


1 commentaires

C'est obscur. J'ai opté pour cette option et tout était bon - merci.



1
votes

J'ai eu cette erreur après avoir placé mon DbContext dans une bibliothèque de classes distincte à l'aide de .NET Core 3.1 .

La solution finale ressemblait à ceci qui a récupéré ma chaîne de connexion de mes applications originales appsettings.json :

var applicationDbContextFactory = new ApplicationDbContextFactory();

using (var dbContext = applicationDbContextFactory.CreateDbContext(args))
{
    
}

Je pourrais ensuite utiliser ceci dans mon autre projet comme ceci:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace MyNamespace
{
    public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json")
                    .Build();

            var optionsBuilder = new DbContextOptionsBuilder();

            var connectionString = configuration
                        .GetConnectionString("DefaultConnection");

            optionsBuilder.UseSqlServer(connectionString);

            return new ApplicationDbContext(optionsBuilder.Options);
        }
    }
}


1 commentaires

il n'est donc pas possible d'avoir un dbcontext et une chaîne de connexion configurés dans un fichier de paramètres dans une classe lib?



0
votes

Ce n'est pas vraiment un problème avec le framework, c'est la façon dont vous avez construit votre application. Par exemple, si vous avez utilisé DI et que vous avez séparé le WebApi (ou le projet MVC) de votre couche d'accès aux données, cela vous arrivera car lorsque vous essayez d'ajouter une migration, vous ne pouvez pas trouver la chaîne de connexion que vous essayer d'injecter (c'était en fait mon cas).

Une bonne explication se trouve ici sur GitHub :

Ce n'est certainement pas un problème d'application qui correspond à l'ampleur des problèmes de ce dépôt, mais je vais quand même essayer de vous donner des conseils.

Vous obtenez cette erreur car pour générer des migrations, vous devez soit:

  1. Un DbContext avec un constructeur par défaut (c'est-à-dire un constructeur sans paramètre)

  2. Être capable d'obtenir le DbContext à partir d'ApplicationServices (c'est-à-dire d'injection de dépendances)

  3. Une fabrique de conception qui renvoie un DbContext correctement configuré.

Puisque le constructeur ApplicationDbContext a un paramètre, vous devez utiliser les options 2 ou 3. Voir les détails dans l'article: https://docs.microsoft.com/ef/core/miscellaneous/cli/dbcontext-creation

Mais l'option 2 (celle utilisée à l'origine) ne fonctionne plus, car le démarrage du programme a été modifié pour améliorer la journalisation.

Et comme il n'y a pas de DesignTimeFactory pour ApplicationDbContext, vous ne pourrez tout simplement pas créer de migrations pour le moment.

Si vous souhaitez en savoir plus sur cette façon de créer des migrations, vous pouvez:

Créez un ApplicationDbContextDesignTimeFactory, similaire à CatalogContextDesignFactory> ou IntegrationEventLogContextDesignTimeFactory, ou essayez avec un autre microservice comme Catalog.API, qui a déjà son DesignTimeFactory.


0 commentaires

0
votes

Si votre projet de démarrage utilise l'hôte Web ASP.NET Core ou l'hôte générique .NET Core, les outils tentent d'obtenir l'objet DbContext auprès du fournisseur de services de l'application, sinon vous pouvez créer le DbContext à partir d'une fabrique au moment du design ( https: // docs.microsoft.com/es-es/ef/core/miscellaneous/cli/dbcontext-creation ).


0 commentaires

0
votes

Dans mon cas, j'ai rendu le fichier appsettings.development.json obligatoire mais je n'ai pas créé le fichier. Si vous ne créez pas le fichier de paramètres spécifiques à l'environnement, définissez-le comme facultatif: true

 Console.WriteLine("I can see this because the app was able to proceed this far."); 

Mais, il est important de noter que l'erreur n'est pas nécessairement liée au DbContext et à ses configurations . Il peut s'agir d'une autre erreur dans le démarrage de votre application qui empêche l'application de démarrer afin que les outils EF puissent effectuer la migration. En tant que mécanisme pour localiser toute autre erreur au démarrage de votre projet, vous pouvez ajouter un message de console à différentes lignes de votre Startup. Vous pouvez même inspecter les valeurs de paramétrage des applications telles que les chaînes de connexion à l'aide de la console tout en essayant de migrer.

var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();


0 commentaires

1
votes

Si vous utilisez un serveur de base de données correctement authentifié comme Azure SQL DB, vérifiez si vous remplacez le Password={your_password} par le mot de passe de votre serveur dans votre chaîne de connexion.


0 commentaires