繁体   English   中英

asp.net 内核 2.0 - 值不能是 null。 参数名称:连接字符串

[英]asp.net core 2.0 - Value cannot be null. Parameter name: connectionString

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

值不能是 null。 参数名称:连接字符串

这是我的启动:

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

程序 class:

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

有趣的是,如果我运行该应用程序,它会显示“Hello World”,但是在添加迁移时它找不到连接字符串。 有人可以在这里点亮一些灯吗? 谢谢。

找不到连接字符串时会出现此问题。

可能你在 Startup 类中有以下代码:

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")只是把你的连接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=****"
  }
}

之后在包管理器控制台中执行“add-migration name”命令

我有同样的问题,但我的解决方案要简单得多。 我所做的只是改变 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 文件中有参数的序列/顺序。

我在负载测试服务时遇到了这样的问题(我向所有人推荐它)并且有大约 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 中的一个错误

我发现了我自己的问题。

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

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

public IConfiguration Configuration { get; }

到:

public IConfiguration Configuration;

它奏效了! 如果有人说为什么将不胜感激。

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

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

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

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

<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。

另一种情况可能是您设置配置的地方。 appsettings.json 中设置连接字符串而不是appsettings.Development.json

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

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

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

在我解决这个问题后,一切都很好。

我有一个类似的问题。 我的appsettings.json有一个错字。 ConnectionsStrings更改为ConnectionStrings为我做到了!

在尝试为 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();
}

我已经通过设置正确的基本路径解决了我的问题。 问题是来自不同包的迁移或其他任何东西使用了错误的 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 复制到正确的位置(如果在那里丢失)。

这对我来说完美无缺:

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

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

当我将“.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”行时,迁移成功

我很笨,我有错别字

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

把它改成

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

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

如果您之前在 appsettings 文件中重命名了连接字符串,并且在 DesignTimeDbContextFactory 类中省略了重命名(如果您的项目中有它)并且由实体框架检查,那么您可能会在此问题中运行。

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

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

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

对我来说,我有appSettings.json而不是appsettings.json出于某种原因(不太确定 VS 是否使用新创建的项目这样做,或者我已将其重命名为该项目)。 一旦我更改了名称,它就可以正常工作。

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

我有这个问题,因为在一个差connectionstringappsetting.json文件,并GetConnectionString(connectionstrings)在参数startup.cs 一旦我在startup.cs删除了额外的s ,问题就消失了。

检查服务器上是否正确设置了ASPNETCORE_ENVIRONMENT变量。 根据该环境,它可能采用appsettings.json而不是appsettings.Staging.jsonappsettings.Production.json

就我而言,我使用的是configuration["DbContext"]

 services.AddDbContext<AstroBhaskarDbContext>(option =>
 {
     option.UseSqlServer(configuration["DbContext"]);
 });

然后我将configuration["DbContext"]替换为configuration.GetConnectionString("DbContext")如下

  services.AddDbContext<AstroBhaskarDbContext>(option =>
  {
     option.UseSqlServer(configuration.GetConnectionString("DbContext"));
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM