代码之家  ›  专栏  ›  技术社区  ›  Mark Wagoner

实体框架未使用更新的连接字符串

  •  2
  • Mark Wagoner  · 技术社区  · 8 年前

    是否可以更改app.config文件中的连接字符串,并让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();
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Ivan Stoev    8 年前

    ConfigurationManager.RefreshSection

    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();
    
    推荐文章