3

C#4.0を使用しています。(Winform アプリケーション) 次のようなコードがあります。

private bool ChangeEFConnectionString(string connStringName, string newValue)
{
    try
    {
        //CreateXDocument and load configuration file
        XDocument doc = XDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

        //Find all connection strings
        var query1 = from p in doc.Descendants("connectionStrings").Descendants()
                     select p;

        //Go throught each connection string elements find atribute specified by argument and replace its value with newVAlue  
        foreach (var child in query1)
        {
            foreach (var atr in child.Attributes())
            {
                if (atr.Name.LocalName == "name" && atr.Value == connStringName)
                    if (atr.NextAttribute != null && atr.NextAttribute.Name == "connectionString")
                    {
                        // Create the EF connection string from existing 
                        EntityConnectionStringBuilder entityBuilder =
                            new EntityConnectionStringBuilder(atr.NextAttribute.Value);
                        //change hte provide conn string
                        entityBuilder.ProviderConnectionString = newValue;
                        //back the full connection string to the configuration fiel
                        atr.NextAttribute.Value = entityBuilder.ToString();
                    }
            }
        }

        doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}

うまく機能しますが、どういうわけか機能しなくなりました。

私がデバッグするとentityBuilder.ProviderConnectionString = newValue;、正しい値がありましたが、それでも接続文字列は変更されません。

4

2 に答える 2

3

接続文字列の読み取りと更新にはConfigurationManagerを使用します。

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.ConnectionStrings.ConnectionStrings[connStringName].ConnectionString = newValue;
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("connectionStrings");
于 2013-09-17T14:21:43.533 に答える
0

必要なのは、 の後にSave、 a:

ConfigurationManager.RefreshSection("connectionStrings");

名前の代わりに EF に接続文字列全体を与えることを検討しましたか? これにより、実行時に名前の意味を変更する必要がなくなります。

于 2013-09-17T14:20:47.663 に答える