我有一个可以与数据库建立连接的应用程序。许多站点都使用此数据库的许多实例。我想在程序加载时使用迁移来更新数据库架构。我有这个工作。 但是,我存储在app.config中的连接字符串已被清空(我),并且我使用连接字符串构建器获取用户登录详细信息和服务器/数据库用户名/密码,并更改dbcontext中的连接字符串以连接至他们自己的数据库。
Eg. source.Database.Connection.ConnectionString "TrustServerCertificate=False;Encrypt=true;Integrated Security =" + integratedSecuity + ";data source=" + Server + ";initial catalog=" + Database + ";persist security info=true;"+ ";MultipleActiveResultSets=True;App=EntityFramework\" providerName = \"System.Data.SqlClient";
我已经利用Stackoverflow的一段代码在程序启动时检查我的实体框架中的更改。
Db = Internal_ConnectionTools.ChangeDatabase(Db, Txt_Database.Text, Txt_Server.Text, Txt_User.Text,Txt_Password.Text);
LabDatabase LD = new LabDatabase(Db.Database.Connection.ConnectionString);
Database.SetInitializer<LabDatabase>(
new MigrateDatabaseToLatestVersion<LabDatabase, Configuration>());
LD.Database.Initialize(true);
我遇到的问题是,它一直指向我App.config文件中的连接字符串,并抛出一个错误,即未定义初始目录。(因为没有设计定义)
如果我用凭据填充app.config连接字符串,则数据库将按预期更新。
如何确保Entityobject.Database.Initialize()使用更新后的自定义字符串并更新用户数据库,而不是默认使用App.config字符串?
答案 0 :(得分:0)
好吧,经过更多的挖掘,我在这里找到了答案
How do I set a connection string config programmatically in .net?
它描述并提供了一种利用反射来允许更改App.config实例中的连接字符串的方法。
我对原始代码做了一些非常小的改动,以适应我的目的。 我的修改方法如下。
private void SpoofAppConfig(string connectionStringName, string connectionString)
{
var settings = ConfigurationManager.ConnectionStrings[connectionStringName];
var fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(settings, false);
settings.ConnectionString = connectionString;
}
这不会更改实际app.config文件中的任何内容。
在迁移之前调用此方法将使您可以使用自定义连接字符串运行迁移,而不会出现我在最初的帖子中遇到的问题。