【问题标题】:Reload web.config after updating connectionstring programmatically in C#在 C# 中以编程方式更新连接字符串后重新加载 web.config
【发布时间】:2015-08-10 17:41:44
【问题描述】:

我在运行时在 web.config 中创建了 Connectionstring。现在我将一些数据保存到我的数据库中,但它仍在读取旧的连接字符串。我该如何解决这个问题?以下是我的代码:

public string EditConnectionString(string userId, string password, string host, string dbName)
{
    try
    {
        System.Configuration.Configuration Config = WebConfigurationManager.OpenWebConfiguration("~");
        ConnectionStringsSection conSetting = (ConnectionStringsSection)Config.GetSection("connectionStrings");
        string providerName = "System.Data.EntityClient";
        string conString = @"metadata=res://*/OWordpress.csdl|res://*/OWordpress.ssdl|res://*/OWordpress.msl;provider=System.Data.SqlClient;provider connection string=" + "\"data source=" + host + ";initial catalog=" + dbName + ";user id=" + userId + ";password=" + password + ";MultipleActiveResultSets=True;App=EntityFramework\"";
        ConnectionStringSettings StringSettings = new ConnectionStringSettings("OWordpressContainer", conString,providerName);
        conSetting.ConnectionStrings.Remove(StringSettings);
        conSetting.ConnectionStrings.Add(StringSettings);
        Config.Save(ConfigurationSaveMode.Modified);

        return MessageFamily.Success.ToString();
    }
    catch(Exception ex)
    {
        return ex.Message.ToString();
    }
}

创建连接字符串后,我正在保存一些数据,如下所示,但它仍然读取旧的连接字符串值:

public string SaveDbInfo(string userId, string password, string host, string dbName)
{
    try
    {
        var optionEntity = new Options();

        optionEntity.key = "DBInfo";
        optionEntity.value = "{userId:'" + userId + "',password:'" + password + "',host:'"+host+"',dbName:'"+dbName+"'}";

        objContext.Options.Add(optionEntity);
        objContext.SaveChanges();
        return MessageFamily.Success.ToString();
    }
    catch(Exception ex)
    {
        return ex.Message.ToString();

    }
}

【问题讨论】:

  • 更改连接字符串后,当使用旧连接字符串时,您的值是否正确保存?
  • 是的,它正在被保存在 web.config 文件中
  • 您是如何以及在何处保存更改的?修改 Web 应用程序的 web.config 会导致应用程序重新启动
  • 如果您在运行时更改 ConnectionString,为什么还要将其保存在 web.config 中?您可以将整个连接字符串传递给 DbContext 构造函数,而不是 web.config 中的命名连接。
  • 你的代码真的有效吗,还是没有保存就导致了异常?你检查EditConnectionString的返回值了吗?

标签: c# asp.net entity-framework


【解决方案1】:

我使用EntityConnectionStringBuilder解决了这个问题

var ecsBuilder = new EntityConnectionStringBuilder(ConfigurationManager.ConnectionStrings["OWordpressContainer"].ToString());

var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString)
{
    InitialCatalog = dbName,
    UserID=userId,
    DataSource=host,
    Password=password
};

var providerConnectionString = sqlCsBuilder.ToString();                
ecsBuilder.ProviderConnectionString = providerConnectionString;    
string contextConnectionString = ecsBuilder.ToString();   

using (var db = new DbContext(contextConnectionString))
{
    OWordpressContainer objContext = new OWordpressContainer(contextConnectionString);    
    var optionEntity = new Options();    
    optionEntity.key = "DBInfo";    
    optionEntity.value = "{userId:" + userId + "',password:'" + password + "',host:'" + host + "',dbName:'" + dbName + "'}";    
    objContext.Options.Add(optionEntity);    
    objContext.SaveChanges();
}

【讨论】:

  • 这没有保存任何东西。如果您只想连接到不同的数据库,那您为什么要询问保存连接字符串?
  • 我认为他想使用相同的 EntityFramework 和 ConnectionName 的 DBContext 连接到不同的数据库,但不同的数据库具有相同的模式,但它是动态的和动态的。答案似乎很好地解决了他的目的。
  • 这段代码有问题 - 它打开两个 DbContext,关闭未使用的 DbContext 并留下 OWordpressContainer 打开
【解决方案2】:

在更改连接字符串后尝试以下代码,如果有帮助,请告诉我-

ConfigurationManager.RefreshSection("connectionStrings");

【讨论】:

  • 哦,你在 - Config.Save() 之后添加了这一行吗?
  • 是的,我在 Config.Save(ConfigurationSaveMode.Modified);
  • 您可以在 web.config 中进行更改后尝试回收应用程序池,使用此答案 - stackoverflow.com/a/249942/3748701。注意:这将清除所有服务器会话数据,请先尝试此操作以进行测试,然后让我知道发生了什么。
  • 那么我不知道我的朋友,如何帮助你,在我的一个项目中,我做了同样的事情,并且使用了 ConfigurationManager.RefreshSection,效果很好:)
  • 这些都没有帮助,因为修改web.config 无论如何都会强制应用程序重新启动。如果实际保存了更改,应用程序将使用新设置重新启动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2013-07-08
  • 1970-01-01
  • 2012-06-23
相关资源
最近更新 更多