gpt4 book ai didi

c# - Entity Framework 不使用更新的连接字符串

转载 作者:行者123 更新时间:2023-11-30 23:00:26 25 4
gpt4 key购买 nike

是否可以更改 app.config 文件中的连接字符串并让 Entity Framework 开始使用新值?

我有一个多线程应用程序,其中一个线程充当调度程序。此线程能够接收一条消息,告诉它更改全部或部分连接字符串数据(例如密码更改)。然后它更新配置文件以包含新的连接信息并清除所有池化的数据库连接。这部分工作正常。

问题是,当调度程序启动一个新线程并且该线程创建一个新的数据库上下文时,数据库连接是使用旧的连接字符串值创建的。似乎 Entity Framework 在某处保留了此信息的缓存副本。如果我完全关闭并重新启动应用程序,它会正常工作,因为很明显,它必须从配置文件中读取新值。

我已经看到其他提议的解决方案涉及将连接字符串保留为变量并将其传递给上下文构造函数。但是由于调度程序线程对它创建的“作业”线程没有内部知识(有些甚至可能不需要数据库访问),这对我来说真的不起作用。至少在我的工作界面没有大量代码更改和特殊要求的情况下。

这是我用来更新文件的代码。正如我所说,这部分正在工作。我还需要做些什么来将更改告知 Entity Framework 吗?

 // Create new connection string

SqlConnectionStringBuilder connectionBuilder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings[CONNECTION_STRING_NAME].ConnectionString);
connectionBuilder.DataSource = server;
connectionBuilder.InitialCatalog = database;
connectionBuilder.UserID = user;
connectionBuilder.Password = password;

// Update connection string within config file

Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
ConnectionStringsSection section = (ConnectionStringsSection)config.GetSection("connectionStrings");
section.ConnectionStrings[CONNECTION_STRING_NAME].ConnectionString = connectionBuilder.ToString();

// Save changes

ConfigurationManager.RefreshSection("connectionStrings");
config.Save();

最佳答案

ConfigurationManager.RefreshSection 的文档方法确实说(重点是我的):

Refreshes the named section so the next time that it is retrieved it will be re-read from disk.

问题是 EF6 缓存了 ConfigurationManager.ConnectionStrings在内部类静态属性中,因此它永远不会被刷新。

不幸的是,没有“官方”方式来刷新它。以下是使用反射的暴力破解,因此使用它需要您自担风险:

static readonly Type EF6AppConfigType = typeof(DbContext).Assembly.GetType("System.Data.Entity.Internal.AppConfig");

static readonly PropertyInfo EF6DefaultAppConfig = EF6AppConfigType.GetProperty("DefaultInstance", BindingFlags.Public | BindingFlags.Static);

static readonly FieldInfo EF6ConnectionStrings = EF6AppConfigType.GetField("_connectionStrings", BindingFlags.NonPublic | BindingFlags.Instance);

static void RefreshEF6ConnectionStrings()
{
EF6ConnectionStrings.SetValue(
EF6DefaultAppConfig.GetValue(null),
ConfigurationManager.ConnectionStrings
);
}

保存更改后调用它:

config.Save();
RefreshEF6ConnectionStrings();

关于c# - Entity Framework 不使用更新的连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51557748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com