Codifique la primera cadena de conexión personalizada y las migraciones sin usar IDbContextFactory

Estoy tratando de escribir un fácil de entenderDBContext clase que toma una cadena de conexión personalizada, puede ejecutar migraciones y que me permite generar migraciones utilizando Package Manager.

Parece que estoy dando vueltas en círculos.

He podido hacer que funcione usando un código que me parece horrible. Documenté esto en mi respuesta aEsta pregunta sobre la cadena de conexión y las migraciones.

La respuesta de Radek se ve mucho mejor que la mía, pero encuentro que cuando la implemento y luego intento crear una migración en el Administrador de paquetes, recibo el mensaje.

El contexto de destino 'DataLayer.Context' no es construible. Agregue un constructor predeterminado o proporcione una implementación de IDbContextFactory.

DóndeDataLayer.Context es mi clase de contexto.

No quiero proporcionar una implementación deIDbContextFactory (y la respuesta de Radek parece indicar que no es necesario)

ACTUALIZAR:

Puedo generar una migración si incluyo un constructor sin parámetro. Por ejemplo

public Context() : base("ConnectionStringName") { }

Para la creación de mi contexto, paso el nombre de la cadena de conexión en app.config

public Context(string connString) : base(connString)
{
    Database.SetInitializer(new CustomInitializer());
    Database.Initialize(true);
}

Por último, puedo generar migraciones y ejecutar migraciones para las bases de datos que el usuario selecciona.

SIN EMBARGO: cuando suelto la base de datos y luego ejecuto mi aplicación, tengo problemas.

El código inicializador que estoy usando, desde el enlace de arriba es

public class CustomInitializer : IDatabaseInitializer<Context>
{       
    public void InitializeDatabase(Context context)
    {
        try
        {
            if (!context.Database.Exists())
            {
                context.Database.Create();
            }
            else
            {
                if (!context.Database.CompatibleWithModel(false))  
                {
                    var configuration = new Configuration();
                    var migrator = new DbMigrator(configuration);
                    migrator.Configuration.TargetDatabase =
                        new DbConnectionInfo(context.Database.Connection.ConnectionString);
                    IEnumerable<string> migrations = migrator.GetPendingMigrations();
                    foreach (string migration in migrations)
                    {
                        var scriptor = new MigratorScriptingDecorator(migrator);
                        string script = scriptor.ScriptUpdate(null, migration);
                        context.Database.ExecuteSqlCommand(script);
                    }
                }
            }
        }
        catch (Exception ex)
        {
        }
    }       
}

Cuando suelto la base de datos, se crea una nueva, pero no tiene tablas. Eso sería porque mi código de creación de tabla está en mi primera migración.

Así que el código dentro de la!context.Database.CompatibleWithModel(false) condición no se ejecuta.

Sin embargo, por desgracia, el código tampoco se ejecuta la segunda vez cuando debería tener el metadatamodel.

Ahora para intentar y ejecutar la migración ...

SADNESS: No con el inicializador personalizado de Radek hasta ahora.

Desde los comentarios de NSGaga he recurrido a salir de la aplicación si cambio la conexión.

var master = new myMDIForm();
master.ConnectionType = connectionType;   // being an enum of the different connection names in app.config
while (master.ConnectionType != ConnectionType.None )
{
   Application.Run(master);
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta