Ok, dopo la soluzione che evocato qui: http://forums.asp.net/p/997608/2209437.aspx
ho creato una classe che, nel costruttore senza parametri (di cui avete bisogno) ottiene solo il server e la porta dagli argomenti della riga di comando. Tale che posso andare "MembershipInitializer.exe "SomeSqlServer \ Instance" 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);
}
}
Nel app.config della console app (o le finestre app)
<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>
Se hai bisogno di anche il provider di ruoli ha la precedenza su SqlRoleProvider, probabilmente allo stesso modo.
Se si sta creando un programma per inizializzare automaticamente il database di appartenenza su uno stato specifico, ma l'indirizzo del server SQL e il nome della porta non sono " Si sa fino a quando qualcuno non li inserisce in un stallo wizard, questo farà il trucco ..
Questo aiuto?
Questo è praticamente quello che sono arrivato alla fine. E 'un peccato che siamo costretti a usare la reflection per impostare i membri privati per farlo funzionare :-(. –
In realtà c'è un modo più semplice per impostare questo campo: juste write config ["connectionString"] = yourConnectionString; la base.Initialize (nome, config); chiama e hai finito!;) – jpatte