0

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

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:\Program Files (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在我看来正确的方法,但是我不会依赖自己亲自编写文件。相反,让框架为您完成繁重的工作。

在此处查看示例。

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

于 2012-11-06T13:08:33.400 回答
0

App.config 不是执行此操作的合适位置,因为它是应用程序使用的全局配置。

我建议您保存每个用户的设置。请参阅此相关问题:c# - 在 WPF 应用程序中保存用户设置的方法?

于 2012-11-06T12:40:29.163 回答