需要在WPF中使用changable App.config文件

时间:2012-11-06 12:28:53

标签: c# wpf deployment runtime app-config

我有一个桌面WPF应用程序,它使用Entity Framework 4.1 Code First方法来管理数据。

EF为App.config文件添加了一个连接字符串,我无法在运行时更改此连接字符串。

情景是这样的:

部署应用程序时,它在App.config文件中有一个默认连接字符串。用户运行应用程序,因为连接字符串可能对用户无效(因为服务器名称,用户ID和密码),我将显示服务器配置窗口。

此处,用户将输入有关其连接的有效信息,然后按确定。然后,我将能够更改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:\ Program Files(x86)\ MyCompany \ MyApp \ MyApp.exe.config“   被拒绝了。“

我知道“程序文件”下的文件是不可变的,所以我该如何处理呢?

3 个答案:

答案 0 :(得分:1)

我无法修改ConfigurationManager.ConnectionStrings["key"]个对象,因为它只是readonly。

所以我决定在我的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");   
    }

答案 1 :(得分:0)

App.config不适合这样做,因为它是应用程序使用的全局配置。

我建议您保存每个用户的设置。请参阅此相关问题:c# - approach for saving user settings in a WPF application?

答案 2 :(得分:0)

在我看来,

App.config 正确的方法,但我不会依赖自己亲自编写文件。相反,允许框架为您做繁重的工作。

查看示例here

编辑:很高兴Sandeep上面的评论帮助了你。如果您想了解更多信息,请随时查看该链接!

相关问题