2
votes

Aucun fournisseur de base de données n'a été configuré pour ce DbContext .NET Core avec SQL Server

Je me suis cogné la tête contre un mur avec celui-ci et j'ai cherché en vain.

Je viens de démarrer un nouveau projet ASP.NET Core MVC, j'ai installé / mis à jour mes packages pour ces deux 2.2.0:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DBConnString")));
}

J'ai configuré le projet pour qu'il attende également .NET Core 2.2.0.

Je peux ajouter ma table avec succès schémas avec cette commande dans la console du gestionnaire de packages pour échafauder la base de données, donc je sais que la chaîne de connexion est correcte / fonctionne:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "DBConnString": "SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;"
  }
}

Le fichier de modèle créé, DatabaseDBContext.cs ressemble à ceci:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        optionsBuilder.UseSqlServer("SERVER=Server\\Instance;DATABASE=Database;UID=user;PWD=password;");
    }
}

Ceci contient également une méthode qui fonctionne pour récupérer mes données d'échafaudage, mais n'est pas considérée comme sûre pour une utilisation en production, alors j'ai commenté ceci :

public partial class DatabaseDBContext : DbContext
{
    public DatabaseDBContext()
    {
    }

    public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options)
        : base(options)
    {
    }
}

J'ai ajouté cette même chaîne de connexion au fichier appsettings.json :

Scaffold-DbContext "SERVER=Server\Instance;DATABASE=Database;UID=user;PWD=password;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables Table1, Table2, Table3

J'ai ensuite ajouté le DbContext au fichier startup.cs :

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

Essayer d'ajouter un nouveau contrôleur échafaudé pour l'une des tables à travers ws cette erreur:

Recherche du 'contrôleur' ​​du générateur ...
Exécution du 'contrôleur' ​​du générateur ...
Tentative de compilation de l'application en mémoire.
Tentative de découverte des métadonnées EntityFramework pour le modèle et DbContext: 'TableName'

Aucun fournisseur de base de données n'a été configuré pour ce DbContext. Un fournisseur peut être configuré en remplaçant la méthode DbContext.OnConfiguring ou en utilisant AddDbContext sur le fournisseur de services d'application. Si AddDbContext est utilisé, assurez-vous également que votre type DbContext accepte un objet DbContextOptions dans son constructeur et le transmet au constructeur de base pour DbContext.

StackTrace:
à Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize (IServiceProvider scopedProvider, IDbContextOptions contextOptions, contexte DbContext)
à Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider ()
à Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService [TService] (IInfrastructure 1 accesseur)
à Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext (Func
1 usine)

Aucun fournisseur de base de données n'a été configuré pour ce DbContext. Un fournisseur peut être configuré en remplaçant la méthode DbContext.OnConfiguring ou en utilisant AddDbContext sur le fournisseur de services d'application. Si AddDbContext est utilisé, assurez-vous également que votre type DbContext accepte un objet DbContextOptions dans son constructeur et le transmet au constructeur de base pour DbContext.

Quelqu'un a-t-il une idée de ce que je fais mal ici?


8 commentaires

Avez-vous essayé de supprimer le constructeur sans paramètre?


Oui, bizarrement si je commente cela, il se plaint plutôt qu'il n'y a pas de paramètre moins constructeur disponible!


Vous avez mentionné que OnConfiguring est commenté, est-ce exact? Ou vous manquez base.OnConfiguring (optionsBuilder); à la fin de la méthode de remplacement OnConfiguring?


Avez-vous également des instances dans le code où vous essayez d'utiliser le DatabaseDBContext actuellement?


L'intrigue s'épaissit un peu. Si je décommente l'instruction OnConfiguring optionsBuilder.UseSqlServer, je peux ajouter le contrôleur échafaudé. Je peux alors recommander l'instruction optionsBuilder.UseSqlServer et tout fonctionne toujours par code en utilisant les services de démarrage AddDbContext. En guise de solution de contournement, cela fonctionne, mais c'est étrange, car cela semble être malheureux en particulier lorsque vous essayez d'ajouter le contenu de l'échafaudage.


RE: la section OnConfiguring, je l'avais complètement commentée, mais même si je ne fais que commenter les lignes if (! OptionsBuilder.IsConfigured), le résultat est le même. Je n'ai rien d'autre dans la section OnConfiguring sauf ce que vous voyez dans mon message d'origine.


Essayez d'ajouter ce providerName = "System.Data.SqlClient" à DBConnString .


J'ai donc réparé mais de manière très détournée. Mon nouveau projet était à l'origine sur une ancienne version de .net core. J'avais mis à jour la version mais il devait y avoir quelque chose qui n'a pas plu lors de la mise à jour. J'ai créé un nouveau projet et l'ai démarré sur 2.2.0, puis cela a fonctionné ...


6 Réponses :


-1
votes

Essayez d'ajouter ce 3ème constructeur:

public DatabaseDBContext()
{
}

public DatabaseDBContext(DbContextOptions<DatabaseDBContext> options)
    : base(options)
{
}

public DatabaseDBContext(DbContextOptions options)
    : base(options)
{
}

Puis ajoutez un point d'arrêt dans chacun d'entre eux juste pour être sûr de celui qui est réellement utilisé.


3 commentaires

Cela n'a malheureusement pas semblé aider, m'a donné une erreur sur le 3ème à propos de l'ambiguïté. Merci quand même! :) Je ne sais pas non plus pourquoi mais aucun des points d'arrêt n'a été atteint.


Oh oui, vous devrez supprimer l'autre constructeur. Je suppose que cela n'a pas aidé non plus!


J'ai donc réparé mais de manière très détournée. Mon nouveau projet était à l'origine sur une ancienne version de .net core. J'avais mis à jour la version mais il devait y avoir quelque chose qui n'a pas plu lors de la mise à jour. J'ai créé un nouveau projet et l'ai démarré sur 2.2.0, puis cela a fonctionné ...



0
votes

J'ai eu le même problème et cela l'a résolu pour moi (configuration de UseSqlServer dans OnConfiguring):

protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
    if (!builder.IsConfigured)
    {
        string conn = this.IsProduction ? Const.ProductionConnectionString : Const.LocalDBConnectionString;

        builder.UseSqlServer(conn);
    }

    base.OnConfiguring(builder);
}


4 commentaires

Où déclarez-vous Const.ProductionConnectionString? Je ne peux pas le sortir de la section de configuration comme je le peux dans startup.cs.


@HungryHippos oh désolé c'est une méthode d'extension personnalisée qui réaccorde l'une des deux chaînes const contenant soit la chaîne de connexion en local, soit en production. Je ne sais pas si cela aide votre problème, mais l'erreur a été corrigée lorsque j'ai spécifié UseSqlServer dans OnConfiguring, même si je l'ai configuré au démarrage.


J'ai donc réparé mais de manière très détournée. Mon nouveau projet était à l'origine sur une ancienne version de .net core. J'avais mis à jour la version mais il devait y avoir quelque chose qui n'a pas plu lors de la mise à jour. J'ai créé un nouveau projet et l'ai démarré sur 2.2.0, puis cela a fonctionné ...


@HungryHippos super, rien n'est mieux que ça :)



2
votes

J'ai donc corrigé mais c'était vraiment détourné. Mon nouveau projet était à l'origine sur une ancienne version de .net core. J'avais mis à jour la version mais il devait y avoir quelque chose qui ne lui a pas plu lors de la mise à jour. J'ai créé un nouveau projet et l'ai démarré sur la version 2.2.0, puis cela a fonctionné ...

La logique du code était correcte ci-dessus. Encore besoin des mêmes packages:

using Microsoft.EntityFrameworkCore;

Startup.cs semble assez différent, donc peut-être que si quelqu'un d'autre voit cela, il pourrait essayer de mettre à jour le code startup.cs:

XXX

A dû ajouter une référence à startup.cs pour cela:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<DatabaseDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DatabaseDBConnString")));

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Cela était nécessaire pour que la méthode AddDbContext se résolve. p >

Après cela, l'échafaudage fonctionne maintenant. Donc c'est corrigé, mais il m'a fallu recommencer pour le réparer.


1 commentaires

La même chose se passe avec l'aperçu de la v3.0.0 6. Ma première pensée est que l'échafaudeur n'est pas prêt à choisir l'instance de contexte dans le conteneur DI. J'ai donc déconseillé le remplacement OnConfiguring et cela a fonctionné. Après la création du contrôleur, j'ai à nouveau commenté et tout a bien fonctionné.



0
votes

J'ai eu ce problème après avoir inséré Program.CreateWebHostBuilder dans Program.Main . J'ai dû l'extraire.


0 commentaires

0
votes

Après avoir combattu ce problème, j'ai trouvé la solution ici

https://github.com/aspnet/EntityFrameworkCore/issues/12331

Le problème était que Add-Migration attendait le CreateWebHostBuilder

public static IWebHostBuilder CreateWebHostBuilder (string [] args)

Avant mon public static void Main (string []) exécutait le WebHost sans le CreateWebHostBuilder statique et qu'après avoir ajouté la fonction Static, cela fonctionnait.


0 commentaires

0
votes

Il a été câblé mais a résolu ce problème en mettant à jour la version du cadre de la solution du projet. Par exemple, j'ai créé un référentiel de base sur 3.0 et installé plus tard la dernière version 3.1 sur le système, il s'attendait donc à être mis à jour avec la dernière version. Je l'ai changé et ça a marché!


0 commentaires