9

używam następujący CLI dla DB migracji:DotNet migracje ef automatyzacja: Wykrywanie zmian w migracjach

  1. dotnet ef migrations add <Name-of-Migration>
  2. dotnet ef database update

Jednakże szukam sposób, aby tak się stało automatycznie: po wykryciu zmiany w Modelu.

Do tej pory udało mi się wyeliminować krok 2, wykonując następujące czynności w Startup.cs:

private void SetupDatabase(IApplicationBuilder app) 
    { 
     using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) 
     { 
      var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); 
      //Migate any pending changes: 
      context.Database.Migrate(); 
     } 
    } 

ten migruje żadnych oczekujących zmian stworzone przez robi: dotnet ef migrations add <Name-of-Migration> ale nie dodać do migracji wszelkie zmiany w modelu. Jak zautomatyzować to migrations add?

+0

Hmm, Po tym. – user3581203

+0

Poprzednie wersje nie mogły być uruchomione przez skrypt z jakiegoś powodu (przynajmniej z ignorowaniem zmiany). –

+0

Nie jest to możliwe w EF7 przynajmniej do automatycznego generowania migracji (nie widziałem w poprzednim EF6, albo używaliśmy). Myślę, że jest to decyzja projektowa podjęta przez zespół EF i która jest zrozumiała. – Hassan

Odpowiedz

11

Updated: Jest możliwe, aby przejść pierwszy etap generowania migracji automatycznie z kodu, decyzji projektowych, które ja osobiście nie zgadzam. Nadal nie jest to możliwe w twoim docelowym EF7, tak jak początkowo powiedziałem (został usunięty z EF7 wydaje się, jak wspomniano, in this SO post, a także na this blog post przez member of Microsoft EF team wspomniana w komentarzach Ivana), ale testowane w EF6 po odpowiedzi Martina. Drugi krok można zautomatyzować, ponieważ już to odkryłeś, więc nie będę go ponownie odtwarzał.

Kroki w pierwszym etapie są następujące (w ASP.NET MVC aplikacji Web z EF6):

  1. w projekcie (który powinien być uruchomiony już w niektórych modelach w stanie spójnym) przejdź do konsoli menedżera pakietów i uruchom Enable-Migrations –EnableAutomaticMigrations. Jeśli twoja aplikacja ma jeden kontekst DB, to również zastosowała tam zmiany.
  2. Teraz przejdź do istniejącego modelu i dodaj tam nowe pole, np. public String TestField { get; set; }
  3. jako kod pierwszy automatyczne migracje są NA, nie trzeba ponownie uruchomić komendę Add-Migration (mam nadzieję, że ja podkreślić w dalszej części tej odpowiedzi), wystarczy uruchomić Update-Database i DB powinny być aktualizowane pozwalając aplikacja działa dobrze.

Dlaczego monitoring automatyczna zmiana modelu do generowania i bazy danych są automatycznie uaktualniane może rykoszetem czasami (moim skromnym zdaniem iz MSDN page):

  • Automatyczne migracje przyzwyczajenie pracować zmiany ostrości zmienia nazwy, jak na MSDN.
  • W przypadku dodawania pierwotnych typów pól należy uwzględnić istniejące dane i rozważyć ręczne migracje w tym scenariuszu.
  • Można przeplatać migracje automatyczne i oparte na kodzie, ale nie jest to zalecane w scenariuszach rozwoju zespołu. Jeśli należysz do zespołu programistów używających kontroli źródła, powinieneś używać wyłącznie migracji automatycznych lub migracji opartych wyłącznie na kodzie. Biorąc pod uwagę ograniczenia migracji automatycznej, MSDN zaleca stosowanie migracji opartych na kodzie w środowiskach zespołowych.
  • Dobrze jest potwierdzić, że zmiana modelu jest zamierzona i nie była wynikiem niektórych resztek kodu podczas wprowadzania zmian, coś, co może się zdarzyć, i zautomatyzowanie całego procesu może spowodować takie zmiany w DB.
  • Migracja, która jest generowana, nie zawsze jest zoptymalizowana i/lub nie powiodła się z powodu pewnych ograniczeń danych lub podobnych problemów, a zatem powinna zostać sprawdzona.
  • Nawet baza danych aktualizacji przekroczyła limit czasu dla danych produkcyjnych w niektórych przypadkach, gdy było zajęte mnóstwo danych podczas migracji. Musieliśmy wtedy ręcznie uruchomić go zdalnie i zrestartować serwer.

Powyższe może nie mieć zastosowania do wszystkich, ale należy się zastanowić, dlaczego zgadzam się z decyzją projektową, że nie spowoduje automatycznego generowania migracji i stosowania do bazy danych.

Wszyscy rozważający włączenie automatycznych migracji powinni na pewno przeczytać MSDN page po więcej przykładów i braków.

+1

* Dla EF7, jeśli znajdę sposób (lub inna osoba), zaktualizuję tę odpowiedź. * Nie trać czasu na szukanie. Przeczytaj artykuł na blogu [EF Core Migrations: Design-time] (http://www.bricelam.net/2014/12/16/ef7-migrations-designtime.html) autorstwa członka zespołu EF Core [bricelam] (https: //stackoverflow.com/users/475031/bricelam), który wyjaśnia, dlaczego automatyczne migracje zostały usunięte z EF Core. –

6

Entity Framework 4.3 has introduced the Automated Migrations.

Chociaż zgadzam się z odpowiedzią Hassana stwierdzającą, że to może być bardzo trudne, ta opcja faktycznie istnieje.

Oto krótki życiorys:

  1. Po włączeniu Migracje, należy podać parametr w konsoli Menedżer pakietów:

enable-migracje -EnableAutomaticMigration: $ true

  1. A Klasa konfiguracji będzie automatyczna lly generowane:

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = true; 
    
        //Set this parameter to true if you want to let auto-migration delete data when a property is removed from an entity. 
        //Not setting this will result in an exception when migration should remove a column. 
        AutomaticMigrationDataLossAllowed = true; 
    } 
    
  2. Ustaw DB initializer w swojej klasie Context

    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, MyConfigurationClass>("MyConnectionString")); 
    

I tam pójdziesz, zmienić swój model i zobaczyć zmiany ...

I Nadal nie jestem pewien, czy będę go używał, ponieważ chcę zmienić moją bazę danych, kiedy tak powiem ...

+0

Miło znaleźć Martina, poszedłem też przeczytać więcej na ten temat i okazało się, że MSDN ma stronę z przykładami, ale zawiera ostrzeżenia, że ​​nie będzie działać w nazwach pól i więcej problemów może pojawić się w środowisku zespołu, więc oni również zniechęcać do przekazywania na nim. Niemniej jednak wydaje się, że ta opcja istnieje. – Hassan

+0

@Hassan Czy możesz połączyć stronę MSDN? Myślę, że duże ostrzeżenie w nagłówku na temat tej odpowiedzi, stwierdzające, że takie użycie jest odradzane, może być pomocne dla przyszłych czytelników. –

+0

Tak właśnie przeczytałem w końcu na https://msdn.microsoft.com/en-us/library/jj554735%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 Mam zamiar zaktualizować moja odpowiedź wkrótce także z większą szczegółowością, po prostu testowanie kilku rzeczy, aby mieć pewność. – Hassan