c# - 为 Code First 实体框架迁移使用自定义连接字符串
问题描述
我有一个可以连接到数据库的应用程序。许多站点使用此数据库的许多实例。我想在程序加载时使用迁移来更新数据库模式。我有这个工作。但是,我存储在 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 字符串?
解决方案
好的,经过更多的挖掘,我在这里找到了答案
它描述并提供了一种利用反射来更改 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 文件中的任何内容。
在迁移之前调用此方法将允许您使用自定义连接字符串运行迁移,而不会出现我在初始帖子中遇到的问题。
推荐阅读
- c# - 如何检测用户何时在 WPF C# 中添加或删除程序
- spring - Spring:使用@Transactional(propagation=Propagation.SUPPORTS) 的方法与没有@Transactional 的方法之间的区别
- python - 下面的例子被认为是有效的吗?如果没有,那怎么能更好呢?
- php - 使用 php 登录 Google 的问题
- swift - UICollectionView 数据源和委托导致应用程序终止
- java - IntelliJ 社区版中的 Spring Boot 项目
- javascript - 鼠标进入时,角度引导弹出框消失
- python - 如何将表单键/值连接到字符串并将其分配给 Django 变量?
- asp.net-mvc - 如何在详细信息部分合并字段和垂直线
- python - sanic.exceptions.MethodNotSupported:方法 GET 不允许用于 URL /model/parse