Tôi bắt gặp điều này cần phải làm điều tương tự, thiết lập chuỗi kết nối thông qua mã và không phải trong web.config, mặc dù tôi cần thay đổi nhiều hơn tên, tôi ne đã chỉnh sửa giá trị thực tế được tạo động. Nếu bạn muốn thay đổi chuỗi kết nối thực tế được tạo ra từ mã bạn có thể làm như sau:
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>
Provider Lớp
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"
}
}
Khi bạn gọi base.Initialize () Lớp .NET yêu cầu có tên được chỉ định trong web.config, đó là lý do tại sao bạn phải đặt thứ gì đó, vì vậy tôi chỉ sử dụng trình giữ chỗ vì tôi biết tôi sẽ ghi đè nó trong mã.
Nhóm của chúng tôi đã làm điều này vì chúng tôi cần xây dựng động các chuỗi kết nối dựa trên các môi trường khác nhau và không muốn phải lo lắng về việc có nhiều web.configs nổi xung quanh.
Cần lưu ý rằng câu trả lời của Joe sẽ hoạt động cho .NET 4.0, nhưng không phải .NET 2.0-3.5, trong khi câu trả lời của Flea cũng sẽ hoạt động. – nateirvin