最初,我在登录时在项目的app.config文件中构建并保存连接字符串。然而,我们的一个内部用户发生了一些事件,其中保存到数据库的数据莫名其妙地不存在。虽然重新登录并重新开启,但缓解了这一问题。
我已经意识到,由于我们都使用存储在我们共享驱动器上的程序的共享副本以及桌面上的快捷方式,因此每次有人登录时,它都会更改连接字符串,这也是所有人共享的。
所以,我一直在尝试将其保存到%appData%文件夹下的本地用户文件中。
这就是我之前所拥有的,如果我们使用该应用程序的本地副本,这将有效。
public class UpdateConfig
{
public static void UpdateConfigConnString(string s)
{
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
connectionStringsSection.ConnectionStrings["MyDB"].ConnectionString = s;
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");
}
}
我尝试将ConfigurationUserLevel
更改为None
,但这给了我一个关于无法更改锁定项目的错误。
这是我现在所处的位置,基于此MSDN文档:
public class UpdateConfig
{
public static void UpdateConfigConnString(string s)
{
string sectionName = "MyDB";
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = config.FilePath;
var currentSection = (ConnectionStringsSection)config.GetSection(sectionName);
if (currentSection == null)
{
currentSection = new ConnectionStringsSection();
currentSection.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToRoamingUser;
currentSection.SectionInformation.AllowOverride = true;
currentSection.ConnectionStrings.Add(new ConnectionStringSettings("MyDB", s));
}
config.Save(ConfigurationSaveMode.Modified);
Debug.WriteLine(config.FilePath);
ConfigurationManager.RefreshSection("connectionStrings");
}
}
运行这个并不能告诉我太多,除了它没有错误。但是,当我尝试找到Debug.WriteLine
打印出来的文件时,Windows无法找到它。另外,我不确定如何确保我的实体框架项目知道在哪里查找连接字符串。
非常感谢任何见解。或者,如果我认为这一切都错了,我愿意接受更好的建议,谢谢。
答案 0 :(得分:0)
如果您需要根据用户输入动态更改连接字符串,则上述方法都不起作用。由于您从共享位置运行exe文件,因此无法在每个用户应用程序数据中保存配置文件。另一方面,在这种情况下更新exe文件本身就是一种非常糟糕的做法。因此,最好不要更新配置文件并考虑替代方法。
在我看来,您应该做的是构建将自定义连接字符串传递给Entity Framework的路径。您可以轻松地创建一个构造函数重载,它将接受自定义连接字符串并将其传递。由于您已经拥有自定义连接字符串,因此需要添加管道代码以传递它。请参阅以下帖子,了解如何操作:
Passing connection string to EF
希望这有帮助!