Code first - aktualizacja bazy bez utraty danych

Odpowiedz Nowy wątek
2017-09-28 09:36
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 ?

Ale z czym konkretnie jest problem? Podmieniasz connection stringa tak, aby wskazywał na bazę danych na produkcji i wykonujesz migracje np. z poziomu Visual Studio, tak, jakby baza znajdowała się u Ciebie na local hoście. - Młodszy Programista 2017-09-28 11:21
Takie podejście będzie miało zastosowanie o ile jest możliwość "dostania" się do bazy z zewnątrz. Nie zawsze tak jednak jest. - marcin82w 2017-09-28 11:23

Pozostało 580 znaków

2017-09-28 10:43
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):


edytowany 1x, ostatnio: marcinN90, 2017-09-28 10:43

Pozostało 580 znaków

2017-09-28 12:42
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.

Pozostało 580 znaków

2017-09-28 20:10
1

Znalazłem rozwiązanie problemu

https://stackoverflow.com/que[...]he-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.

edytowany 1x, ostatnio: marcin82w, 2017-09-28 22:01

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0