0

EntityFramework4.1コードファーストアプローチを使用してデータを管理するデスクトップWPFアプリケーションがあります。

EFはApp.configファイルに接続文字列を追加しますが、実行時にこの接続文字列を変更することはできません。

シナリオは次のようになります。

アプリケーションをデプロイすると、App.configファイルにデフォルトの接続文字列が含まれます。ユーザーがアプリケーションを実行し、接続文字列がユーザーにとっておそらく無効になるため(サーバー名、ユーザーID、およびパスワードのため)、サーバー構成ウィンドウを表示します。

ここで、ユーザーは自分の接続に関する有効な情報を入力し、[OK]を押します。その後、App.configファイルを変更して、ユーザーの新しい有効な情報をファイルに保存できるようになります。

問題:

ConfigurationManagerを使用して変更すると、変更は一時的なものになります。つまり、ファイルは保存されず、変更はメモリに行われます。

App.configファイルをストリームに読み込み、メモリに必要な変更を加え、物理ファイルを削除し、メモリストリームをApp.configとして再度保存すると、WindowsはProgramFilesフォルダーの下のファイルに変更を加えることができません。

ここでの最善のアプローチは何でしょうか?

編集:再び問題!

この方法でApp.configファイルを変更した後:

private void ApplyChangesToConnectionString()
{
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
    connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString = GetChangesAppliedConnectionString(connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString);
    config.Save(); // This line throws an exception
    ConfigurationManager.RefreshSection("connectionStrings");   
}

config.Save();メソッド呼び出しはエラーをスローします

「「C:\ ProgramFiles(x86)\ MyCompany \ MyApp\MyApp.exe.config」へのアクセスが拒否されました。」

「プログラムファイル」の下のファイルは不変であることを知っていますが、これをどのように処理できますか?

4

3 に答える 3

2

ConfigurationManager.ConnectionStrings["key"]オブジェクトは読み取り専用であるため、変更できませんでした。

そこで、App.configファイルに新しい接続文字列を追加して、次のようにすることにしました。

<connectionStrings>
<add name="SomeUniqueName" connectionString="Data Source=(local)\SQLExpress;Initial Catalog=MyDb;User Id=sa;Password=password; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

次に、DbContextコンストラクターを変更して、次のように新しく追加された接続文字列を取得します。

public MyContext()
        : base("name=SomeUniqueName")
    {

    }

ここで、接続文字列とコンストラクターのname属性の値は一致する必要があります。

次に、実行時にこの新しく追加された接続文字列を変更するために、次のようなメソッドを使用しました。

private void ApplyChangesToConnectionString()
    {
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
        connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString = GetChangesAppliedConnectionString(connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString);
        config.Save();
        ConfigurationManager.RefreshSection("connectionStrings");   
    }
于 2012-11-06T13:13:45.763 に答える
0

App.configは、アプリケーションで使用されるグローバル構成であるため、これを行うのに適切な場所ではありません。

ユーザーごとに設定を保存することをお勧めします。この関連する質問を参照してください:c#-WPFアプリケーションにユーザー設定を保存するためのアプローチ?

于 2012-11-06T12:40:29.163 に答える
0

App.config私の意見では正しいアプローチですが、ファイルを自分で物理的に書き込むことに依存することはありません。代わりに、フレームワークがあなたに代わって手間のかかる作業を行うことを許可してください。

こちらのサンプルをご覧ください。

編集:上記のGladSandeepのコメントはあなたを助けました。もう少し詳しい情報が必要な場合は、そのリンクもチェックしてください。

于 2012-11-06T13:08:33.400 に答える