1. ホーム
  2. c#

[解決済み] .NET Core 2.0アプリでハードコードされた接続文字列の代わりにappsettings.jsonから接続文字列を取得する。

2023-04-22 11:02:02

質問

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 から取得) をすでにプロジェクトに組み込んでいるものとします。