Mi sono imbattuto in questo che ha bisogno di fare la stessa cosa, impostare la stringa di connessione tramite codice e non nel web.config, anche se ho bisogno di cambiare più del nome, io ne modificare il valore effettivo da generare dinamicamente. Se si desidera modificare la stringa di connessione effettiva deve essere generato dal codice è possibile effettuare le seguenti operazioni:
web.config
...
<connectionStrings>
<add name="ConnectionPlaceHolder" connectionString="This is a place holder"/>
</connectionStrings>
...
<roleManager defaultProvider="SqlRoleProvider" enabled="true">
<providers>
<clear/>
<add name="SqlRoleProvider" type="MyClassLibraries.Web.Security.MyCustomSqlRoleProvider" connectionStringName="ConnectionPlaceHolder" applicationName="MyApplicationName"/>
</providers>
</roleManager>
Class Provider
public class MySqlRoleProvider : SqlRoleProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
try
{
config["connectionStringName"] = "ConnectionPlaceHolder";
base.Initialize(name, config);
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
connectionStringField.SetValue(this, ApplicationConfiguration.RetrieveApplicationConfigurationValue(myConnectionString));
}
catch (Exception ex)
{
CurrentOperation.RaiseException(ex);
throw ex;
}
}
private string myConnectionString()
{
return "Server=MyServer;database=MyDB;uid=aspnetDBUser;pwd=myPassword"
}
}
Quando si chiama base.Initialize () la classe .NET richiede ci sia un nome specificato nel web.config che è il motivo per cui devi mettere qualcosa, quindi ho appena usato un segnaposto poiché sapevo che lo avrei sovrascritto nel codice.
Il nostro team ha fatto questo perché avevamo bisogno di creare dinamicamente stringhe di connessione basate su ambienti diversi e non volevamo preoccuparci di avere più web.configs in giro.
Va notato che la risposta di Joe funzionerà con .NET 4.0, ma non con .NET 2.0-3.5, mentre la risposta di Flea funzionerà per entrambi. – nateirvin