Ok, después de la solución que evocaba aquí: http://forums.asp.net/p/997608/2209437.aspx
he creado una clase que, en el constructor sin parámetros (que necesita) simplemente obtiene el servidor y el puerto desde los argumentos de la línea de comando. De tal manera que puedo ir "MembershipInitializer.exe 'SomeSqlServer \ Instancia' 51000.
public class CustomSQLMembershipProvider : SqlMembershipProvider {
private readonly string _server;
private readonly string _port;
/// <summary>
/// Initializes a new instance of the <see cref="T:System.Web.Security.SqlMembershipProvider"/> class.
/// </summary>
public CustomSQLMembershipProvider() {
string[] args = System.Environment.GetCommandLineArgs();
// args[0] is the exe name
_server = args[1];
_port = args[2];
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(name, config);
// Update the private connection string field in the base class.
string connectionString = string.Format(@"Data Source={0},{1};Initial Catalog=aspnetdb;UID=NICCAMembership;PWD=_Password1;Application Name=NICCA;Connect Timeout=120;", _server, _port);
// Set private property of Membership provider.
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
connectionStringField.SetValue(this, connectionString);
}
}
En el app.config de la aplicación de consola (o ventanas de aplicación)
<configuration>
<connectionStrings>
<clear/>
<add name="MembershipDB"
connectionString="Some Bogus String here that gets overrided in the custom class"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<authentication mode="Forms"/>
<authorization>
<deny users="?"/>
</authorization>
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
connectionStringName="MembershipDB"
applicationName="NICCA"
type="MyInitializeMembershipDB.CustomSQLMembershipProvider, MyInitializeMembershipDB"
requiresUniqueEmail="false"
requiresQuestionAndAnswer="false"/>
</providers>
</membership>
</system.web>
</configuration>
Si usted está en necesidad de el proveedor de roles también mordió, probablemente deba sobrescribir SqlRoleProvider de la misma manera.
Si está creando un programa para inicializar automáticamente su base de datos de miembros a un estado específico, pero la dirección del servidor sql y el nombre del puerto aren ' t conocido hasta que alguien los ingresa en un puesto de asistente, esto hará el truco ..
¿Esto ayuda?
Eso es más o menos a lo que llegué al final. Es una pena que nos veamos obligados a utilizar la reflexión para establecer miembros privados con el fin de hacer que esto funcione :-(. –
En realidad, hay una manera más simple de establecer este campo: juste write config ["connectionString"] = yourConnectionString; before la base. Inicializar (nombre, configuración); llamar y listo!;) – jpatte