我有一个桌面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“ 被拒绝了。“
我知道“程序文件”下的文件是不可变的,所以我该如何处理呢?
答案 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上面的评论帮助了你。如果您想了解更多信息,请随时查看该链接!