Code first - aktualizacja bazy bez utraty danych

0

Witam

Mam działającą aplikację napisaną w asp.net mvc. Zaszła potrzeba przebudowy struktury aplikacji i dodania dodatkowych opcji, co również pociągnęło za sobą zmiany w bazie danych. I tu pojawił się problem z aktualizacją bazy bez utraty danych. Na maszynie developerskiej używałem inicjalizatora bazy, który po wykryciu zmian usuwa aktualna bazę i tworzy nową zgodnie z zaktualizowaną strukturą. W trakcie tworzenia aplikacji baza była czysta, więc inicjalizator usuwał bazę z danymi testowymi, które nie miały większego znaczenia. Przy ostatnich zmianach użyłem migracji do zaktualizowania struktury bazy danych zgodnie z podejściem Code First. Migracje pozwolą mi na aktualizację bazy na maszynie developerskiej. Pojawia się jednak problem na docelowej platformie hostingowej. Tu migracje nie zaktualizują struktury bazy.

Jak sobie poradzić z aktualizacją bazy danych na docelowej platformie hostingowej bez utraty danych ?

1

Migracje powinny działać także na hostingu zewnętrznym (np. mam jedną apkę na webio.pl i migracje działają).
Jeśli niestety jest tak jak mówisz, to mozliwe wyjścia (ogólne):

0

U mnie niestety nie działa.

Mój inicjalizator to:

    public class InitDatabase : DropCreateDatabaseIfModelChanges<MyDbContext>
    {
        protected override void Seed(MyDbContext context)
        {
            //init databse
        }
    }

A więc dziedziczy po DropCreateDatabaseIfModelChanges, więc zgodnie z oczekiwaniem po zmianie struktury usuwa starą bazę i tworzy nową czystą bazę zgodną ze zaktualizowanym schematem..

Kiedy usunę inicjalizator z Global.asax dostaję komunikat:

The model backing the 'MyDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

I tu się pojawia problem jak zaktualizować bazę zgodnie z nowym schematem na docelowej platformie hostingowej bez utraty już istniejących danych.

Pewnym rozwiązaniem jest modyfikacja inicjalizatora do postaci:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());

Przy pierwszym uruchomieniu wykonuje aktualizację schematu bazy danych. Problem pojawia się kiedy po dłuższym czasie ponownie chcę użyć aplkiacji, przy pierwszym wejściu od razu się wysypuje:

There is already an object named 'Models' in the database.

Nie wiem dlaczego chce od nowa tworzyć całą bazę, nawet tabele które nie uległy zmianie.

1

Znalazłem rozwiązanie problemu

https://stackoverflow.com/questions/26305273/there-is-already-an-object-named-in-the-database/26305974#26305974

Wydaje mi się że problemu by nie było gdybym od początku tworzenia projektu używał migracji.

Podaję rozwiązanie, może ktoś będzie miał taki sam problem i będzie to dla niego pomocne.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.