web-dev-qa-db-fra.com

asp.net core 2.0 - La valeur ne peut pas être nulle. Nom du paramètre: connectionString

J'ai eu l'erreur suivante dans la console du gestionnaire de paquets lorsque Add-Migration

La valeur ne peut pas être nulle. Nom du paramètre: connectionString

Ceci est mon démarrage:

namespace MyProject
{
    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration config)
        {
            Configuration = config;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContextPool<AppDbContext>(options =>
                             options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<IDevRepo, DevRepo>();
            services.AddMvc();
            services.AddMemoryCache();
            services.AddSession();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(Configuration["Message"]);
            });
        }
    }
}

classe de programme:

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

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, builder) => builder.SetBasePath(context.HostingEnvironment.ContentRootPath)
                       .AddJsonFile("appsettings.json")
                       .Build())

            .UseStartup<Startup>()
            .Build();
}

appsettings.json:

{
  "Message": "Hello World",
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=NotMyFault;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Fait intéressant, si je lance l'application, elle affiche "Hello World", mais ne peut pas trouver connectionString lors de l'ajout d'une migration. Quelqu'un peut-il s'il vous plaît jeter quelques lumières ici? Merci.

18
Bing Han

J'ai trouvé mon propre problème.

J'ai une classe AppDbContextFactory qui hérite de IDesignTimeDbContextFactory. La suppression de cette classe résout ce problème. 

1
Bing Han

Ce problème est survenu lorsque la chaîne de connexion est introuvable.

Vous avez probablement les codes suivants dans la classe de démarrage:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BenchmarkContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("yourConnectionString name from appsettings.json")));
    }

Ces méthodes résolvent votre problème :

1- Au lieu de Configuration.GetConnectionString("yourConnectionString name from appsettings.json"), mettez simplement votre chaîne de connexion.

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BenchmarkContext>(options =>
  options.UseSqlServer("Data Source=.;Initial Catalog=Benchmark;Persist Security Info=True;User ID=****;Password=****"));
    }

2- Si vous utilisez le fichier de configuration, ajoutez ces codes à la classe de démarrage:

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

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BenchmarkContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("TestConnection")));
    }

Fichier Appsetting.json:

{
  "ConnectionStrings": {
    "TestConnection": "Data Source=.;Initial Catalog=Benchmark;Persist Security Info=True;User ID=****;Password=****"
  }
}

Après cela, exécutez la commande 'add-migration name' dans la console Package Manager

15
Iman Bahrampour

J'ai eu le même problème, mais ma solution était beaucoup plus simple. Tout ce que j'ai fait était de changer l'ordre des appsettings.json de:

{
  "Message": "Hello World",
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=NotMyFault;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

à:

{
   "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=NotMyFault;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Message": "Hello World"
}

Je soupçonne qu'il y a une séquence/un ordre de paramètres dans le fichier appsettings.json.

6
Jay

J'ai eu le même problème, car j'utilisais la valeur par défaut dans Startup.cs . Je viens de modifier la propriété de configuration à partir de:

public IConfiguration Configuration { get; }

à:

public IConfiguration Configuration;

et cela a fonctionné! Si quelqu'un dit pourquoi serait apprécié.

2
Sharif Yazdian

J'ai eu un problème similaire pour les raisons suivantes:

  • appsettings.json n'a pas été inclus dans le projet
  • J'exécutais le projet à partir du chemin qui ne contenait pas appsettings.json
2
bigyanshr

Probablement, le problème vient de votre DotNetCliToolReference du fichier csproj. Si vous migrez le projet depuis une version antérieure d'asp.net core, DotNetCliToolReference n'est pas automatiquement mis à jour . Mettez à jour le fichier yourproject.csproj pour qu'il utilise la version 2.0.0 de la CLI, comme indiqué dans l'extrait ci-dessous:

<ItemGroup>

        ...
          <DotNetCliToolReference 
               Include="Microsoft.EntityFrameworkCore.Tools.DotNet" 
               Version="2.0.0" />
</ItemGroup>

Relancez, à partir du dossier du projet, la commande dotnet avec le commutateur -v pour afficher les résultats.

dotnet ef database update -v

En outre, vérifiez à nouveau vos packages de nuget Microsoft.EntityFrameworkCore afin de référencer la version 2.0.0. Supprimez ou mettez à jour les anciens packages EF. Les minimum sont:

  • Microsoft.EntityFrameworkCore.SqlServer

  • Microsoft.EntityFrameworkCore.Design

les deux 2.0.0 en ce moment.

2
Mircea Matei

J'ai eu un problème similaire après avoir essayé d'utiliser un nouveau projet créé pour ASP.NET Core 2.0 Web Api. D'après ce que j'ai trouvé, le problème était dû au fait que les paramètres d'application spécifiés pour l'environnement de développement n'étaient pas ajoutés. Je l'ai corrigé en mettant à jour le fichier de démarrage comme suit: 

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
}

Dans mon cas, la classe de programme ressemble à ceci:

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

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

Si vous avez précédemment renommé votre chaîne de connexion dans le fichier appsettings et que vous avez omis de le renommer dans la classe DesignTimeDbContextFactory (si vous l'avez dans votre projet) et que cela est vérifié par Entity Framework, vous pouvez alors exécuter ce problème.

0
Sami-L

J'avais un tel problème lors de l'analyse du service (je le recommande à tous) et j'avais ~ 3/1000 requêtes avec erreurs, Alors j'ai changé 

services.AddDbContextPool<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

à

string connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContextPool<AppDbContext>(options =>
options.UseSqlServer(connectionString));

Donc, il lit la chaîne de connexion une fois et n'utilise pas la configuration à chaque requête. Et maintenant, 100% des requêtes aboutissent . Mais cela semble être un bogue dans .Net Core

0
Pavel Biryukov

Mon problème était quand j'essayais d'exécuter App.dll dans le dossier netcoreapp2.1, mais le bon dossier est netcoreapp2.1\publish \

0
Liam Kernighan

J'ai résolu mon problème en définissant un chemin de base correct. Le problème est que les migrations ou quoi que ce soit d'autre provenant de différents packages utilisent un mauvais chemin d'accès au fichier appsetting.json. Pas sûr que ce soit un problème officiel.

Je viens de changer mon Startup.cs comme suit:

public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }

Après cela, il vous suffit de copier votre fichier appsettings.json au bon endroit s'il manque.

0
ADM-IT

Cela a fonctionné parfaitement pour moi: 

public IConfiguration Configuration;
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext.ApplicationDbContext>(options => 
            //options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            options.UseSqlServer("Server=serverAddress; Database=dbName; user=username; password=pswd"));
}

La partie commentée est juste comme référence où remplacer. 

0
H35am

Un autre scénario peut être où vous définissez la configuration. définir la chaîne de connexion dans appsettings.jso n au lieu de appsettings.Development.json

0
aads