Entity Frameworkのコア接続文字列 - 環境変数

asp.net asp.net-core c# entity-framework entity-framework-core

質問

私はエンティティフレームワークのコアを使用している.netのコアアプリケーションがあります。コマンドラインからエンティティフレームワークの移行または更新を実行すると、「値はnullにはなりません。パラメータ名:connectionString」

接続文字列は環境変数として保持されます。

ConnectionStrings__SomeContextConnection  ...(localdb)\\MSSQLLocalDB...

しかし、その同じ接続文字列を.json設定ファイルに移動すると、次のようになります。

"ConnectionStrings": {  
    "SomeContextConnection": "...(localdb)\\MSSQLLocalDB..." 
}

エンティティ・フレームワーク・ツールは、問題なく接続文字列を認識します。 Startup.csでコードをデバッグする場合:

var connectionString = _config.GetConnectionString("SomeContextConnection");

文字列が2つの場所のいずれかに格納されているときにconnectionString変数が正しい文字列に設定されますが、環境変数varを使用するときにデータベースに接続しようとするとクラッシュします。

(注:環境変数の場合、接続文字列はエスケープされるので、

(localdb)\\MSSQLLocalDB...

(localdb)\\\\MSSQLLocalDB...

追加のバックスラッシュを削除しても問題は解決されません)

更新:接続文字列をWindowsレベルの環境変数に移動すると、正常に動作します。 Visual Studio環境変数を使用している場合にのみ問題となるようです。

人気のある回答

移行にはDesignTimeContextFactoryクラスを使用することをお勧めします。

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyContext>
{
    AmpContext IDesignTimeDbContextFactory<MyContext>.CreateDbContext(string[] args)
    {
        var connectionString = ConfigHelper.GetConnectionString();

        var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
        optionsBuilder.UseSqlServer(connectionString);

        return new AmpContext(optionsBuilder.Options);
    }
}

私のためのGetConnectionstringはこのようなもので、私は私のアプリケーションを通して(つまり、私のWeb APIプロジェクトと統合テストのために)それを使います:

public class ConfigHelper
{
    /// <summary>
    /// Gets the connectionstring from the appsettings.databasestring.json file in the solution root if there is no environment variable to be found
    /// </summary>
    /// <param name="solutionBasePath">Optional to not auto resolve the solution base path</param>
    /// <returns></returns>
    public static string GetConnectionString(string solutionBasePath = null)
    {
       //how to set it on IIS on the server: https://stackoverflow.com/a/36836533/1343595
        var environmentString = Environment.GetEnvironmentVariable("CUSTOMCONNSTR_MyContextDb");

        if (!string.IsNullOrEmpty(environmentString))
            return environmentString;

        if(!string.IsNullOrEmpty(solutionBasePath))
            return GetStringFromConfig(Path.Combine(solutionBasePath, "appsettings.databasestring.json"));

        var filePath = Path.Combine(GetSolutionBasePath(), "appsettings.databasestring.json");

        return GetStringFromConfig(filePath);
    }

    private static string GetStringFromConfig(string filePath)
    {
        IConfigurationRoot config = new ConfigurationBuilder()
            .AddJsonFile(filePath) //you can change the value of the connectionstring in the appsettings file and add it to gitignore so the change will not effect others
            .Build();

        var connectionString = config.GetConnectionString("MyContextDb");
        return connectionString;
    }

    /// <summary>
    /// Gets the current soution base path
    /// </summary>
    /// <returns></returns>
    public static string GetSolutionBasePath()
    {
        var appPath = PlatformServices.Default.Application.ApplicationBasePath;
        var binPosition = appPath.IndexOf("\\bin", StringComparison.Ordinal);
        var basePath = appPath.Remove(binPosition);

        var backslashPosition = basePath.LastIndexOf("\\", StringComparison.Ordinal);
        basePath = basePath.Remove(backslashPosition);
        return basePath;
    }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ