Koduj pierwszy niestandardowy ciąg połączenia i migracje bez użycia IDbContextFactory

Próbuję napisać łatwy do zrozumieniaDBContext klasa, która pobiera niestandardowy ciąg połączenia, może uruchamiać migracje, i że pozwala mi generować migracje za pomocą Menedżera pakietów.

Wydaje mi się, że chodzę w kółko.

Udało mi się to uruchomić za pomocą kodu, który jest dla mnie okropny. Udokumentowałem to w mojej odpowiedzi naTo pytanie dotyczące ciągu połączenia i migracji.

Odpowiedź Radka wygląda znacznie lepiej niż moja, ale stwierdzam, że kiedy ją implementuję, a następnie próbuję utworzyć migrację w Menedżerze pakietów, otrzymuję wiadomość

Kontekst docelowy „DataLayer.Context” nie jest konstruktywny. Dodaj domyślny konstruktor lub podaj implementację IDbContextFactory.

GdzieDataLayer.Context to moja klasa kontekstu.

Nie chcę zapewnić implementacjiIDbContextFactory (a odpowiedź Radka wydaje się wskazywać, że nie jest potrzebna)

AKTUALIZACJA:

Mogę wygenerować migrację, jeśli dołączę konstruktor bez parametru. Na przykład

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

Dla mojego tworzenia kontekstu przekazuję nazwę ciągu połączenia w app.config

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

W końcu mogę zarówno generować migracje, jak i uruchamiać migracje dla baz danych wybranych przez użytkownika.

JEDNAK: Po upuszczeniu bazy danych i uruchomieniu aplikacji mam problemy.

Kod inicjatora, którego używam, z powyższego linku to

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)
        {
        }
    }       
}

Kiedy upuszczam bazę danych, tworzona jest nowa, ale nie ma tabel. Byłoby tak, ponieważ mój kod do tworzenia tabeli jest w mojej pierwszej migracji.

Więc kod wewnątrz!context.Database.CompatibleWithModel(false) warunek nie działa.

Jednak niestety kod również nie uruchamia się po raz drugi, gdy powinien mieć metadatamodel.

Teraz spróbuj uruchomić migrację ...

SADNESS: Nie z dotychczasowym inicjatorem Radka.

Z komentarzy NSGagi uciekłem do wyjścia z aplikacji, jeśli zmienię połączenie.

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);
}

questionAnswers(2)

yourAnswerToTheQuestion