21

Mogę używać menedżera pakietów do lokalnego uruchamiania "update-database -verbose".ASP.NET MVC 4, Migracje - Jak uruchomić "aktualizacyjną bazę danych" na serwerze produkcyjnym

Prawdopodobnie głupie pytanie, ale nie mogę go znaleźć w Internecie - po wdrożeniu mojej witryny - jak uruchomić to ręcznie na serwerze?

Po drugie - jakie inne strategie zaleciłbyś do wdrożenia migracji bazy danych do produkcji - i jak byłyby one lepsze?

Dzięki

+0

Nie obejmuje to ręcznego wykonywania "bazy danych aktualizacji" - tak jak w przypadku VS. ie - Na serwerze nie ma konsoli menedżera paczek - czy używasz po prostu polecenia w powłoce power lub wierszu poleceń? Jeśli tak, nie udało mi się znaleźć tego nigdzie. Chciałbym wiedzieć, jak uruchomić to ręcznie - zamiast polegać na automatycznych migracji w aplikacji. – niico

+0

Dlatego właśnie chciałbym wiedzieć, jak wykonać to ręcznie – niico

Odpowiedz

25

Masz kilka opcji:

  • można użyć update-database -script do generowania poleceń SQL, aby zaktualizować bazę danych na serwerze
  • Można użyć pliku migrate.exe wykonywalny, który znajduje się w folderze pakietu na /packages/EntityFramework5.0.0/tools/migrate.exe. Używałem go z powodzeniem w przeszłości przy użyciu Team Brain Builder firmy Jet Brains, aby skonfigurować migracje za pomocą moich skryptów wdrażania.
  • Jeśli używasz IIS Web Deploy można powiedzieć serwer wykonać migracje po publikują (patrz rys poniżej)
  • mogłeś ustawień automatycznych migracje, ale wolę mieć kontrolę, gdy coś się dzieje :)

Aktualizacja: Ponadto, sprawdź Sayed Ibrahim's blog, pracuje na MSBuild zespołu w firmie Microsoft i ma kilka świetnych spostrzeżeń na temat wdrożeń

enter image description here

+0

Aby mieć kontrolę, zawsze używam tego "Można użyć aktualizacji bazy danych-skrypt do generowania poleceń SQL do aktualizacji bazy danych na serwerze" (chociaż wolę aby w ogóle nie używać automatycznych migracji, ale to jest inny temat) – Michel

3

Dla nas, DBA są jedyną grupą, aby mieć dostęp do produkcji (i pre-produkcji) warunkach. Po prostu używamy komendy paczki konsoli Update-Database -Script, aby uzyskać wymagane przez Sql do aktualizacji bazy danych. To zostaje przekazane im, gdzie mogą je potwierdzić, itp.

Może trochę zbyt uproszczony dla niektórych, ale działa.

HTH.

1

Osobiście lubię konfigurować automatyczne migracje uruchamiane za każdym razem, gdy wywoływana jest metoda uruchamiania aplikacji. W ten sposób przy każdym wdrożeniu, które powoduje migracja, po prostu uruchom i zaktualizuj aplikację automatycznie.

Zobacz ten wpis z AppHarbor. http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3

Istota polega na tym, że chcesz włączyć automatyczne migracje, a następnie wywołaj DatabaseInitializer z kodu, korzystając z metody OnModelCreating lub z pliku Global.asax.

0

Skrypty można uzyskać za pomocą poleceń EF (update-database -script) lub można napisać skrypt ręcznie. Nie jest to najważniejsza rzecz w aktualizowaniu bazy danych w środowisku produkcyjnym. Dla mnie najważniejszą rzeczą jest upewnienie się, że wszystkie skrypty działają poprawnie i wpłynęły na rekordy zgodnie z oczekiwaniami. Moim zdaniem, powinieneś mieć środowisko przedprodukcyjne, a baza danych powinna być kopią środowiska produkcyjnego. W ten sposób możesz uruchomić skrypty i wdrożyć aplikację w całkiem podobnym środowisku i sprawdzić, czy są jakieś problemy. Czasami skrypty są wykonywane poprawnie w środowisku DEV, ale zawodzą w środowisku produkcyjnym.Aby uniknąć bólu głowy, należy symulować środowisko produkcyjne w środowisku przedprodukcyjnym. Jeśli chodzi o skrypty, jeśli zespół ma więcej niż jednego programistę, wolę kategoryzować skrypty w skryptach struktury i skryptach danych. Skrypty struktury zmieniają strukturę bazy danych (dodawaj tabelę, dodawaj kolumnę do tabeli itp.), A skrypty danych wstawiają/aktualizują/usuwają rekordy. Ponadto każdy skrypt powinien określać swoje zależności, aby nie mogły być wykonane w niewłaściwej kolejności. Skrypt danych wstawiający wiersze w tabeli A nie może zostać wykonany, dopóki tabela A nie zostanie utworzona. Oto, co robię: - Zdefiniuj tabelę do rejestrowania wykonanych skryptów. Na przykład: ExecutedScriptsHistory. - Każdy skrypt ma numer i nazwę. - Po wykonaniu skryptu do tabeli ExecutedScriptsHistory wstawiany jest nowy wiersz. -Przed uruchomieniem skryptu sprawdza jego zależności. W tym celu sprawdza, czy skrypty zostały wykonane (istnieje w tabeli ExecutedScriptsHistory).

Po uruchomieniu skryptów można sprawdzić, czy wszystkie skrypty zostały wykonane sprawdzając ExecutedScriptsHistory. Ta strategia jest podobna do tej wybranej przez Microsoft w Migracji EF, ale masz pełną kontrolę nad nią.

9

Wiem, że pytanie jest już odpowiedź, ale na przyszłość:

Jedną z opcji jest, aby umieścić coś takiego w konstruktorze Twojego DB klasy kontekstu:

public MyDbContext() 
    { 
     System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());    
    } 
+3

Mimo że to podejście wykonuje zadanie, zdecydowanie ten wiersz kodu nie musi być wykonywany za każdym razem, gdy tworzony jest 'MyDbContext'. Jeśli więc ktoś zamierza zastosować to podejście, warto rozważyć umieszczenie tego kodu w statycznym konstruktorze klasy 'MyDbContext'. Lub w metodzie 'Application_Start' w pliku' Global.asax.cs'. Lub gdzieś indziej wystarczająco blisko głównego katalogu aplikacji. – Deilan

+0

Dziękuję. To proste rozwiązanie uczyniło mój dzień. – Sam

0

tylko daj wszystkim prostą odpowiedź.

Jest to "Update Database" W folderze migracje, Configuration.cs:

internal sealed class Configuration : DbMigrationsConfiguration<projectname.Models.dbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; // Update-Data -Force (deletes columns etc) 
    } 

A "Włącz migracje" w pierwszym miejscu na serwerze zdalnym, dodać to do Global. złożyć asax.cs:

 protected void Application_Start() 
    { 
     .... 
     System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext, Migrations.Configuration>()); 
+0

należy pamiętać, że w niektórych wersjach EF może to prowadzić do utraty danych. Istnieją wersje EF, które w przypadku zmiany nazwy kolumny usuwają starą kolumnę i tworzą nową. Kiedy zastosujesz swój kod (szczególnie część "DataLossAllowed = true"), stracisz dane. – Michel

1

proste rozwiązanie: bieganie Update-Database z lokalnej konsoli Package Manager zapewniając parametru ciąg połączenia z połączenia ciąg produkcyjny. Trzeba także podać nazwę dostawcy połączenia (SQLSERVER w tym kodzie przykład):

Update-Database -ConnectionString <your real remote server connection string here> -ConnectionProviderName System.Data.SqlClient 

Zamiast ciągu połączenia można użyć nazwy ciąg połączenia obecny w pliku app.config connectionStrings rozdział:

Update-Database -ConnectionStringName <your connection string name here> 

Musisz mieć uprawnienia dostępu do tego serwera z lokalnego komputera. Na przykład, jeśli możesz połączyć się z serwerem za pomocą Sql Server Management Studio, możesz z niego skorzystać.

Należy zauważyć, że takie podejście nie jest zalecane w przypadku rzeczywistego systemu produkcyjnego, należy użyć czegoś takiego, jak wyjaśniono w zaakceptowanej odpowiedzi. Może jednak pomóc w szybkich atakach w zdalnych serwerach programistycznych, środowiskach testowych itp.