web-dev-qa-db-ja.com

asp.net core 2.0-値はnullにできません。パラメーター名:connectionString

Add-Migrationのときにパッケージマネージャーコンソールで次のエラーが発生しました

値をnullにすることはできません。パラメーター名: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"
  }
}

興味深いことに、アプリを実行すると「Hello World」と表示されますが、移行を追加するとconnectionStringが見つかりません。誰かがここでいくつかの光を当ててください。ありがとう。

24
Bing Han

私は自分の問題を見つけました。

IDesignTimeDbContextFactoryを継承するAppDbContextFactoryクラスがあります。このクラスを削除すると、この問題は解決します。

1
Bing Han

この問題は、接続文字列が見つからない場合に発生しました。

おそらく、スタートアップクラスには次のコードがあります。

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-構成ファイルを使用する場合は、これらのコードをStartupクラスに追加します。

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'コマンドを実行します

22
Iman Bahrampour

私は同じ問題を抱えていましたが、私の解決策はずっと簡単でした。私がしたことは、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ファイルにパラメーターのシーケンス/順序があるのではないかと疑っています。

9
Jay

Startup.csでデフォルト値を使用していたため、同じ問題が発生しました。構成プロパティを編集しました:

public IConfiguration Configuration { get; }

に:

public IConfiguration Configuration;

そしてそれは働いた!誰かが理由を言うと感謝されます。

3
Sharif Yazdian

次の理由により、同様の問題が発生していました。

  • appsettings.jsonはプロジェクトに含まれていませんでした
  • Appsettings.jsonを含まないパスからプロジェクトを実行していました
2
bigyanshr

おそらく、問題は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です。

2
Mircea Matei

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

サービスをロードするときにこのような問題が発生し(すべてに推奨)、エラーが発生した〜3/1000リクエストがあったため、変更しました

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

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

そのため、接続文字列を1回読み取り、すべての要求で構成を使用しません。そして今、100%のリクエストが成功しています。しかし、それは.Net Coreのバグのようです

1
Pavel Biryukov

正しいベースパスを設定することで問題を解決しました。問題は、マイグレーションまたは異なるパッケージからのその他のものが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が適切な場所にない場合はコピーするだけです。

1
ADM-IT

私は同じ問題を抱えていましたが、接続の名前が一致することを確認する必要がありました:

      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)で同じであることを確認してください

これを修正した後、すべてが順調でした。

0
Carolina R

Appsettingsファイルに以前に接続文字列の名前を変更したがあり、DesignTimeDbContextFactoryクラス(プロジェクトにある場合)で名前を変更しなかった場合、Entity Frameworkによってチェックされ、この問題。

0
Sami-L

IDesignTimeDbContextFactoryを使用している場合は、パラメーターなしで既定のコンストラクターを追加する必要があります。次のようなものを試してください:

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

    _connectionString = configuration.GetConnectionString("ConnectionStringName");
}
0
Tyler Findlay

私の問題は、netcoreapp2.1フォルダー内でApp.dllを実行しようとしたときでしたが、正しいフォルダーはnetcoreapp2.1\publish \です

0
Liam Kernighan

これは私にとって完璧に機能しました:

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

コメントされた部分は、どこを置き換えるかを示しています。

0
H35am

別のシナリオとして、構成を設定する場合があります。接続文字列をappsettings.Development.jsonではなくappsettings.jso nに設定します

0
aads