[解決済み] .NET Core 2.0アプリでハードコードされた接続文字列の代わりにappsettings.jsonから接続文字列を取得する。
質問
NET Core2.0アプリで以下のようなクラスがあります。
// required when local database does not exist or was deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
public AppContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
return new AppContext(builder.Options);
}
}
これは Core 2.0 のマイグレーションで Database が存在しない場合に必要です。
更新データベース
.
ASP.NET Core 2.0 へのアップグレード後に移行を作成できない。
接続文字列を2箇所(こことappsettings.json)ではなく、.jsonにのみ記述したいのですが、どうすればよいでしょうか? にのみ表示されるようにしたいので、置き換えを試みました。
"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
で
ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
を実行しましたが、うまくいかず、NULL値が表示されます。
UPDATE 1です。
Core 2では.jsonを明示的に追加する必要がないため、ファイルの問題ではないことを念のためお伝えしておきます。
https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/
UPDATE 2:
また、.jsonからContextへのConnectionStringの送信には、すでにConfigurationを使用しています。
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
しかし,これを
ToDoContextFactory
は Configuration を持っていないからです。
ToDoContextFactory
は migrations によって使用されるため、App はまったく実行されません。
解決方法です。 JRBさんからの回答を元に、以下のようにしました。
public AppContext CreateDbContext(string[] args)
{
string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin\" }, StringSplitOptions.None)[0];
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(projectPath)
.AddJsonFile("appsettings.json")
.Build();
string connectionString = configuration.GetConnectionString("DefaultConnection");
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer(connectionString);
return new AppContext(builder.Options);
}
どのように解決するのですか?
STEP1:OnConfiguring()に以下を記述します。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json")
.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
}
STEP2:appsettings.jsonを作成します。
{
"ConnectionStrings": {
"DefaultConnection": "Server=YOURSERVERNAME; Database=YOURDATABASENAME; Trusted_Connection=True; MultipleActiveResultSets=true"
}
}
STEP3:appsettings.jsonを正しいディレクトリにハードコピーする。
Hard copy appsettings.json.config to the directory specified in the AppDomain.CurrentDomain.BaseDirectory directory.
Use your debugger to find out which directory that is.
前提: Microsoft.Extensions.Configuration.Json パッケージ (Nuget から取得) をすでにプロジェクトに組み込んでいるものとします。
関連
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】.net coreでappsettings.jsonから値を取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] 2つのリストを結合する
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] Core 2.0のConfigurationBuilderでSetBasePathを設定する方法
-
[解決済み] ASP.NET Core 2.0にアップグレードした後、マイグレーションを作成できない
-
[解決済み] Visual StudioでAddJsonFile()メソッドが定義されていないと言われるのはなぜですか?