asp.net core 2.0 - 值不能为null。参数名称:connectionString

时间:2017-09-02 02:46:29

标签: asp.net asp.net-mvc asp.net-core

添加迁移时,包管理器控制台中出现以下错误

  

值不能为空。参数名称:connectionString

这是我的创业公司:

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"]);
            });
        }
    }
}

程序类:

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"
  }
}

有趣的是,如果我运行应用程序,它会显示&#34; Hello World&#34;,但是当添加迁移时,它无法找到connectionString。有人可以在这里点灯吗?感谢。

23 个答案:

答案 0 :(得分:16)

无法找到连接字符串时发生此问题。

您可能在启动课程中有以下代码:

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

这些方法解决了您的问题

1-而不是Configuration.GetConnectionString("yourConnectionString name from appsettings.json")只是把你的连接字符串。

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

2-如果您要使用配置文件,请将这些代码添加到启动类:

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

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

Appsetting.json文件:

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

之后执行添加迁移名称&#39;包管理器控制台中的命令

答案 1 :(得分:7)

我遇到了同样的问题,但我的解决方案要简单得多。我所做的只是改变appsettings.json的顺序:

{
  "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"
}

我怀疑appsettings.json文件中有参数的顺序/顺序。

答案 2 :(得分:2)

我遇到了同样的问题,因为我使用的是 Startup.cs 中的默认值。 我刚刚从以下位置编辑了配置属性:

public IConfiguration Configuration { get; }

收件人:

public IConfiguration Configuration;

成功了! 如果有人说为什么会被感激。

答案 3 :(得分:2)

问题可能来自csproj文件中的DotNetCliToolReference。如果从较旧版本的asp.net核心迁移项目,则DotNetCliToolReference不会自动更新。 更新yourproject.csproj文件以使用CLI的2.0.0版本,如下面的代码段所示:

<ItemGroup>

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

从项目文件夹中重新运行带有-v开关的dotnet命令以查看结果

dotnet ef database update -v

此外,请重新检查Microsoft.EntityFrameworkCore nuget包以引用2.0.0版本。删除或更新旧的EF包。最低要求是:

  • Microsoft.EntityFrameworkCore.SqlServer

  • Microsoft.EntityFrameworkCore.Design

此时此刻都是2.0.0。

答案 4 :(得分:2)

由于以下原因,我遇到了类似的问题:

  • appsettings.json未包含在项目中
  • 我正在从不包含appsettings.json的路径中运行项目

答案 5 :(得分:2)

我有一个类似的问题。 appsettings.json中有一个错字。将ConnectionsStrings更改为ConnectionStrings对我有用!

答案 6 :(得分:1)

在尝试为ASP.NET Core 2.0 Web Api使用新创建的项目后,我遇到了类似的问题。据我所知,问题的原因是未添加为开发环境指定的应用程序设置。我通过将启动文件更新为以下内容来修复它:

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();
}

在我的案例中,程序类如下所示:

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

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

答案 7 :(得分:1)

我发现了自己的问题。

我有一个继承IDesignTimeDbContextFactory的AppDbContextFactory类。删除此类可解决此问题。

答案 8 :(得分:1)

当我将“ .UseContentRoot”指定为当前进程路径时,我遇到了类似的问题。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseUrls("http://*:3001")
            .UseStartup<Startup>()
            .UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName));

因此,在运行Add-Migration时,进程路径与项目bin路径不同,因此该进程找不到appsettings.json文件。 当我删除“ .UseContentRoot”行时,迁移成功

答案 9 :(得分:0)

检查服务器上是否正确设置了 $products = Product::withCount([ 'orders as quantity' => function ($query) { $query->select(DB::raw("sum(quantity)")); } ])->orderBy('quantity') ->get(); 变量。根据该环境,它可能采用 ASPNETCORE_ENVIRONMENT 而不是 appsettings.jsonappsettings.Staging.json

答案 10 :(得分:0)

我很傻,有错字

{
  "Conn*ce*tionStrings": {
    "DefaultConnection": "Data source=***.db"
  },

将其更改为

{
  "ConnectionStrings": {
    "DefaultConnection": "Data source=datingapp.db"
  },

答案 11 :(得分:0)

由于connectionstring文件的appsetting.jsonGetConnectionString(connectionstrings)中的startup.cs参数不同,我遇到了这个问题。一旦我在s中删除了多余的startup.cs,问题就消失了。

答案 12 :(得分:0)

我遇到了相同的错误,并通过将“ ConnectionStrings”移动为appsettings.json文件中的第一个变量来解决了该问题。

答案 13 :(得分:0)

我想我会补充一下对我来说。我遵循了一个流行的教程,将appsettings.json和依赖项注入添加到控制台应用程序。在安装程序中,我没有意识到它引用了当前目录,并使用该目录来设置配置构建器的基本路径。当我在本地运行时,它运行良好,但是当我尝试部署并让SQL计划的作业运行命令时,它将进入输入命令的目录,而不是DLL所在的目录,因此找不到我的目录。 appsettings.json文件。我只是删除了有关获取当前目录并将其设置为基本路径的行,并且工作正常。似乎它默认与DLL位于同一文件夹。

答案 14 :(得分:0)

对我来说,出于某种原因我拥有appSettings.json而不是appsettings.json(不确定VS是使用新创建的项目执行此操作,还是我将其重命名为该名称)。一旦我更改了名称,它就可以正常工作。

答案 15 :(得分:0)

我遇到了同样的问题,这是什么,我必须确保连接名称匹配:

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

其中**** ConnectionStrings:DefaultConnection ***是我遇到整个问题的地方。 确保在Startup.cs和appsettings.json(VS 2019中为appsettings.Development.json)中相同

我修复此问题后,一切都很好。

答案 16 :(得分:0)

如果使用的是IDesignTimeDbContextFactory,则需要向其添加不带参数的默认构造函数。尝试这样的事情:

public DbContextFactory()
{
    IConfigurationRoot configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddEnvironmentVariables()
        .AddJsonFile("appsettings.json", false, true)
        .Build();

    _connectionString = configuration.GetConnectionString("ConnectionStringName");
}

答案 17 :(得分:0)

可以在另一种情况下设置配置。在 appsettings.jso n中设置连接字符串,而不是在 appsettings.Development.json

中设置

答案 18 :(得分:0)

在加载服务时遇到了此类问题(我向所有人推荐),并且有3/1000个请求有错误, 所以我改变了

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

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

因此它会读取连接字符串1次,并且不会在每个请求上都使用Configuration。现在100%的请求已成功。 但这似乎是.Net Core中的错误

答案 19 :(得分:0)

如果您先前已在appsettings文件中先前重命名了连接字符串,并且省略了在DesignTimeDbContextFactory类中重命名连接字符串(如果您的项目中有此链接),并且已由Entity Framework检查,则您可能会在此问题中运行。

答案 20 :(得分:0)

这对我来说是完美的:

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"));
}

被注释的部分仅作为替换位置的参考。

答案 21 :(得分:0)

我已经通过设置正确的基本路径解决了我的问题。问题是从其他软件包进行迁移或其他任何操作都使用了错误的appsetting.json文件路径。不确定这是否是官方问题。

我刚刚按如下所示更改了Startup.cs:

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();
    }

此后,您只需将appsettings.json复制到正确的位置(如果缺少该位置)。

答案 22 :(得分:0)

我的问题是当我尝试在netcoreapp2.1文件夹中运行App.dll时,但正确的文件夹是netcoreapp2.1 \ publish \