7

To jest długie pytanie, ale byłbym bardzo wdzięczny, gdybym mógł uzyskać dobrą radę w tej sprawie. Krótko mówiąc, szukam dobrego podejścia do aktualizacji wersji schematu bazy danych MS SQL, która również wymaga przenoszenia danych z usuniętych tabel do nowych tabel.Jak uniknąć utraty danych za pomocą modelu EF Pierwsza aktualizacja schematu bazy danych?

Myślę, że Stack Overflow jest najbardziej odpowiednim miejscem na to pytanie (nie dba.stackexchange.com), ponieważ w jego istocie jest to problem dla programistów .NET korzystających z Entity Framework, a części bazy danych tego składają się głównie z automatycznie generowane skrypty sql.


Tło

aplikacji .NET i SQL bazy danych jest uruchomiony w Azure (Aplikacja w role pracowników i bazy danych w Azure SQL). Do tej pory uaktualnienia wersji działały dobrze, ponieważ wszystkie zmiany w schemacie bazy danych były proste (jak dodanie nowej kolumny). Jednak od teraz muszę również zajmować się przenoszeniem danych z jednej tabeli do drugiej podczas aktualizacji. (Mogę to naprawić tymczasowo, tworząc nową bazę danych, generuję skrypt ze danymi ze starej bazy danych i ręcznie edytuję skrypt, aby pasował do nowego schematu, ale mam nadzieję, że istnieje lepsze podejście).

Używam Entity Framework i używam Model First. Encje i powiązania są zdefiniowane w Visual Studio Data Model Designer, a to podejście jest bardzo odpowiednie dla mojej aplikacji.

Używam dacpac do aktualizacji bazy danych Azure SQL, a to podejście działało dobrze do tej pory (ale teraz dostanę utratę danych, więc teraz muszę znaleźć sposób na przeniesienie danych do nowych tabel).

Mam nadzieję, że będę mógł nadal używać struktury encji i definiować elementy/powiązania w projektancie, ale w razie potrzeby można przełączyć się z aktualizacji na inną technologię.

Upgrade podejście do tej pory

  1. dodam nowych podmiotów (tabele), stowarzyszenia (relacje) i właściwości (kolumny) w projektanta.
  2. Klikam prawym przyciskiem myszy, wybieram "Generuj bazę danych z modelu ...", co powoduje skrypt .sql, który usuwa stare obiekty bazy danych i tworzy nowe obiekty bazy danych.
  3. Tworzę pustą bazę danych i uruchamiam skrypt w celu utworzenia tabel/kluczy itp.
  4. W SQL Server Management Studio prawym przyciskiem myszy klikam bazę danych i wybieram "Zadania -> Wyodrębnij aplikację warstwy danych ...". Po zakończeniu działania kreatora otrzymuję dacpac, którego potrzebuję (w rzeczywistości mogę teraz usunąć bazę danych, ponieważ utworzyłem ją tylko po to, aby móc pobrać plik dacpac, ponieważ nie sądzę, żebym mógł go wygenerować w Visual Studio Data Model Designer) .
  5. Kliknij prawym przyciskiem myszy bazę danych Azure SQL i wybierz "Zadania -> Uaktualnij aplikację warstwy danych ..." i postępuj zgodnie z instrukcjami kreatora. Do tej pory nigdy nie miałem utraty danych, więc zadziałało to dobrze!

Obecna sytuacja

To jest uproszczony przykład, aby zilustrować problem, ale będę się w niemal identycznej sytuacji dość często od teraz wydaje. Spójrz na starą i nową wersję schematu na poniższym rysunku. Załóżmy, że w bazie danych znajdują się już dane. Potrzebuję danych w ImageFile, aby znaleźć się w ImageFileOriginal lub ImageFileProcessed w zależności od wartości Boolean/bit IsOriginal. Za pomocą "Aktualizacji aplikacji warstwy danych" otrzymam ostrzeżenie o utracie danych. Jakie podejście zaleca Pan sobie z tym poradzić?Jak już wspomniałem wcześniej, w razie potrzeby można przełączyć się z aktualizacji na dakpac na inną technologię.

Old schema New schema

czytałem o Visual Studio bazy danych projektów, Fluent Migrator, Red Gate i Entity Database Designer Power Generation paczka (Nie obsługuje Visual Studio 2012), ale nie znaleźć dobra droga do tego. Przyznaję, że nie poświęciłem całego dnia na wkopanie się w każdą technologię, ale z pewnością spędziłem trochę czasu, próbując znaleźć dobre podejście.

Odpowiedz

0

W klasie Configuration ustawić konstruktora jak poniżej:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
    AutomaticMigrationDataLossAllowed = false; 
} 

ustawić właściwość AutomaticMigrationEnabled do true oznacza używamy automatyczny kod najpierw migrację i inną nieruchomość AutomaticMigrationDataLossAllowed jest ustawiony na false oznacza, że ​​w trakcie migracji nie istniejące dane zostaną utracone z tego migracji tabeli bazy danych.

Cała klasa Configuration jest następująca.

Powiązane problemy