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が見つかりません。誰かがここでいくつかの光を当ててください。ありがとう。
私は自分の問題を見つけました。
IDesignTimeDbContextFactoryを継承するAppDbContextFactoryクラスがあります。このクラスを削除すると、この問題は解決します。
この問題は、接続文字列が見つからない場合に発生しました。
おそらく、スタートアップクラスには次のコードがあります。
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'コマンドを実行します
私は同じ問題を抱えていましたが、私の解決策はずっと簡単でした。私がしたことは、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ファイルにパラメーターのシーケンス/順序があるのではないかと疑っています。
Startup.csでデフォルト値を使用していたため、同じ問題が発生しました。構成プロパティを編集しました:
public IConfiguration Configuration { get; }
に:
public IConfiguration Configuration;
そしてそれは働いた!誰かが理由を言うと感謝されます。
次の理由により、同様の問題が発生していました。
おそらく、問題は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です。
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();
}
サービスをロードするときにこのような問題が発生し(すべてに推奨)、エラーが発生した〜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のバグのようです
正しいベースパスを設定することで問題を解決しました。問題は、マイグレーションまたは異なるパッケージからのその他のものが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が適切な場所にない場合はコピーするだけです。
私は同じ問題を抱えていましたが、接続の名前が一致することを確認する必要がありました:
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)で同じであることを確認してください
これを修正した後、すべてが順調でした。
Appsettingsファイルに以前に接続文字列の名前を変更したがあり、DesignTimeDbContextFactoryクラス(プロジェクトにある場合)で名前を変更しなかった場合、Entity Frameworkによってチェックされ、この問題。
IDesignTimeDbContextFactoryを使用している場合は、パラメーターなしで既定のコンストラクターを追加する必要があります。次のようなものを試してください:
public DbContextFactory()
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json", false, true)
.Build();
_connectionString = configuration.GetConnectionString("ConnectionStringName");
}
私の問題は、netcoreapp2.1フォルダー内でApp.dllを実行しようとしたときでしたが、正しいフォルダーはnetcoreapp2.1\publish \です
これは私にとって完璧に機能しました:
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"));
}
コメントされた部分は、どこを置き換えるかを示しています。
別のシナリオとして、構成を設定する場合があります。接続文字列をappsettings.Development.jsonではなくappsettings.jso nに設定します