6

Mam dwa foldery do migracji (Autokontekst i UserProfileContext), każdy ma swoją własną migrację i niestandardowy sql do uruchomienia po migracji danych i tym podobne.Pierwsze migracje EF kodu nie są uruchomione po wdrożeniu na platformie Azure

Działa to dobrze, gdy używana jest konsola menedżera pakietów. I

  1. Restore z produkcji
  2. Run Update Database -ConfigurationTypeName Migrations.Auth.Configuration
  3. Run Update Database -ConfigurationTypeName Migrations.UserProfile.Configuration

Wtedy wszystko jest bardzo szczęśliwy w nowa baza danych, migracje wykonane dane przetasowane tam, gdzie trzeba.

Próbowałem przetestować migracje na opublikowanie utworu przez:

  1. Restore produkcję na bazie dev
  2. pojedynczy ciąg połączenia (wszystkie konteksty wykorzystywać takie same) wskazał dev baza danych,
  3. Publikowanie w błękicie strona internetowa
  4. sprawdzone pole dla Zastosuj kod najpierw Migracje
  5. dobrane, że ciąg pojedynczego połączenia

OK, opublikowano w porządku; jednak kiedy poszedłem do bazy danych, nic się nie stało! Nie utworzył niezbędnych tabel, kolumn ani przesunięć danych.

TLDR; Kod pierwsze migracje nie są wyświetlane po opublikować Azure

Update 1 Próbowałem dowolną kombinację poniżej: tylko jeden pojedynczy ciąg połączenia tak zgaduję, że nie jest to problem i wykonać migracje jest sprawdzone. enter image description here

Po opublikowaniu api działa, ale nie wprowadzono żadnych zmian w bazie danych. Pomyślałem, że być może najpierw muszę to uderzyć, ale dostaję losowe błędy, gdy próbuję użyć api (która teraz oczywiście opiera się na nowej konfiguracji bazy danych), a baza danych wciąż nie jest zmieniona.

Widziałem kilka referencji na temat konieczności dodania czegoś do mojej klasy startowej, ale nie jestem pewien, jak postępować.

Aktualizacja 2 Rozwiązałem jeden problem dodając "Persist Security Info = True" do mojego ciągu połączenia. Teraz faktycznie łączy się z bazą danych i wywołuje mój interfejs API; jednak nie są przeprowadzane żadne migracje. Dołączyłem debuggera do środowiska programistycznego Azure i przejrzałem ... podczas pierwszego wywołania bazy danych, który wszedł w klasę konfiguracji dla danej migracji, a następnie nie mogę wykryć błędu w barfach.

public Configuration() 
{ 
    AutomaticMigrationsEnabled = false; 
    MigrationsDirectory = @"Migrations\Auth"; 
    ContextKey = "AuthContext"; 
} 

Update 3

Dobra, wykopał dół i po raz pierwszy trafi do bazy danych jesteśmy erroring. Tak, to ma sens, ponieważ model się zmienił, ale mam migracje na miejscu, włączone i sprawdzone! Ponownie, to działa dobrze, gdy działa „Update-Database” z konsoli menedżera pakietów, ale nie przy użyciu wykonać kod najpierw Migracje podczas publikowania do Azure

Model kopii kontekst „AuthContext” zmieniła się od bazy było stworzony. Rozważ skorzystanie z Code First Migrations w celu zaktualizowania bazy danych (http://go.microsoft.com/fwlink/?LinkId=238269).

Update 4 Ok znalazłem problem korzeniowy tutaj. VS konfiguruje dodatkowe atrybuty web.config dla databaseInitializer tylko w jednym z kontekstów bazy danych, ten, o którym nie wspomniano, jest w rzeczywistości trafiony przede wszystkim z mojej aplikacji.

Teraz muszę dowiedzieć się, jak uzyskać wiele kontekstów lub połączyć wszystkie moje rzeczy w jeden kontekst.

+0

Czy wziąłeś al o tym poście http://blogs.msdn.com/b/webdev/archive/2014/04/09/ef-code-first-migrations-deployment-to-an-azure-cloud-service.aspx, wygląda możesz potrzebować dodać kod do kodu Application_Start Global.asax –

+0

@JWDzięki, widziałem to, specjalnie dla usługi Cloud Azure i używam Witryny Azure, dla której podobno nie musisz robić nic więcej ... –

+0

Myślę, że musisz się upewnić, że uruchomiono kod migracji bazy danych bez względu na to, jaki to jest projekt. –

Odpowiedz

3

Rozwiązany! Podsumowując rozwiązanie dla potomności:

Włącz kod Najpierw migracja włącza je tylko dla jednego podstawowego ciągu połączenia na pole wyboru, niezależnie od tego, ile kontekstów ma migracje w stosunku do tego ciągu połączenia podstawowego. Tak więc w moim przypadku wybrałem dwa z nich na dwa różne ciągi połączeń.

Następnie trafiałem na inne błędy i stwierdziłem, że jeśli zmieniasz ciąg połączenia podstawowego na identyfikator modelu asp, musisz dodać (jeden raz opublikować) dodatkową bazę flag ("AuthContext", throwIfV1Schema: false)

10

Odpowiedź na to pytanie nie jest zbyt szczegółowa.

Ten artykuł wyjaśnia, co musiałem zrobić, aby rozwiązać podobny problem do tego: https://blogs.msdn.microsoft.com/webdev/2014/04/08/ef-code-first-migrations-deployment-to-an-azure-cloud-service/

będę grubsza opisać etapy musiałem wziąć poniżej:

Krok 1 Dodaj swoje połączenia ciągi do swoich dbContexts, w mojej sytuacji, były oba takie same.

enter image description here

Krok 2 Dodaj to do Twojej web.config

<appSettings> 
    <add key="MigrateDatabaseToLatestVersion" value="true"/> 
    </appSettings> 

Krok 3 i dodać do dołu swoimi Global.asax.cs/Startup.cs (Uruchomienie OWIN)

var configuration = new Migrations.Configuration(); 
    var migrator = new DbMigrator(configuration); 
    migrator.Update(); 
+0

Nie widzę sekcji DANE w moim asystencie publikacji, ale mimo to zadziałało, dzięki! – Daniel

+1

Doskonały. Musiałem dodać kod, o którym wspomniałeś, aby wywołać metodę Seed podczas uruchamiania. Wielkie dzięki, spędziłem godziny próbując to zrozumieć. – rolls

+0

Dziękuję za to! Twoje rozwiązanie działało w przykładowym projekcie kodu serwera Xamarin Forms wygenerowanym przez Azure. Zamiast dodawać do pliku global.asax.cs (ponieważ go nie mam) dodałem kod do metody ConfigureMobileApp() w pliku Startup.MobileApp.cs. –