Przenoszenie danych z EF6 do EF Core

Rozwiązanie Entity Framework Core (EF Core) to całkowicie napisana od nowa wersja rozwiązania Entity Framework dla nowoczesnych architektur aplikacji. Ze względu na fundamentalne zmiany nie ma bezpośredniej ścieżki uaktualnienia. Celem tej dokumentacji jest udostępnienie kompleksowego przewodnika dotyczącego przenoszenia aplikacji rozwiązania EF6 do rozwiązania EF Core.

Ważne

Przed rozpoczęciem procesu przenoszenia należy sprawdzić, czy rozwiązanie EF Core spełnia wymagania dotyczące dostępu do danych dla aplikacji. Wszystko, czego potrzebujesz, znajdziesz w dokumentacji rozwiązania EF Core.

Ważne

Istnieje znany problem (microsoft/dotnet-apiport #993) z analizatorem przenośności, który błędnie zgłasza rozwiązanie EF Core jako niezgodne z platformami .NET 5 i .NET 6. Te ostrzeżenia można bezpiecznie zignorować, ponieważ rozwiązanie EF Core jest w 100% zgodne z platformami docelowymi .NET 5 i .NET 6.

Przyczyny do uaktualnienia

Cały rozwój rozwiązania Entity Framework ukierunkowany jest na rozwiązanie EF Core. Nie ma planów przenoszenia nowych funkcji do rozwiązania EF6. Rozwiązanie EF Core działa w najnowszych środowiskach uruchomieniowych platformy .NET i w pełni korzysta ze środowiska uruchomieniowego oraz funkcji specyficznych dla platformy (np. ASP.NET Core lub WPF) oraz specyficznych dla języka. Oto kilka korzyści wynikających z uaktualnienia:

  • Korzystanie z ciągle opracowywanych ulepszeń wydajności rozwiązania EF Core. Na przykład jeden z klientów, który przeprowadził migrację z rozwiązania EF6 do rozwiązania EF Core 6, zaobserwował 40-krotne zmniejszenie użycia dużych zapytań w wyniku zastosowania funkcji dzielenia zapytań. Wielu klientów zgłasza ogromne wzrosty wydajności przez samo przejście na najnowszą wersję rozwiązania EF Core.
  • Korzystanie z nowych funkcji rozwiązania EF Core. Do rozwiązania EF6 nie będą dodawane żadne nowe funkcje. Wszystkie nowe funkcje, na przykład dostawca usługi Azure Cosmos DB i DbContextFactory, zostaną dodane tylko do rozwiązania EF Core. Aby zapoznać się z pełnym porównaniem platformy EF6 z platformą EF Core, w tym kilkoma funkcjami wyłącznymi na platformę EF Core, zobacz: Porównanie platformy EF Core i EF6.
  • Modernizacja stosu aplikacji przy użyciu wstrzykiwania zależności i bezproblemowa integracja dostępu do danych z technologiami takimi jak gRPC i GraphQL.

Uwaga dotycząca migracji

W tej dokumentacji używane są terminy przenoszenie i uaktualnienie, aby uniknąć pomyłek z terminem migracje jako funkcją rozwiązania EF Core. Migracje w rozwiązaniu EF Core nie są zgodne z migracjami „najpierw kod” w rozwiązaniu EF6 z powodu znacznych ulepszeń sposobu obsługi migracji. Nie ma zalecanego podejścia do przenoszenia historii migracji, więc zaplanuj rozpoczęcie „na świeżo” w rozwiązaniu EF Core. Bazę kodu i dane z migracji z rozwiązania EF6 można zachować. Zastosuj ostateczną migrację w rozwiązaniu EF6, a następnie utwórz początkową migrację w rozwiązaniu EF Core. Od tego momentu będzie można śledzić historię w rozwiązaniu EF Core.

Kroki uaktualniania

Ścieżka uaktualniania została podzielona na kilka dokumentów zorganizowanych według fazy uaktualniania i typu aplikacji.

Określanie „gatunku” rozwiązania EF Core

Istnieje kilka metod współdziałania rozwiązania EF Core z modelem domeny i implementacją bazy danych. Ogólnie rzecz biorąc, większość aplikacji będzie przestrzegać jednego z tych wzorców i sposób podejścia do przeniesienia będzie zależeć od „gatunku” aplikacji.

Kod jako źródło prawdy jest podejściem, w którym wszystko jest modelowane za pomocą kodu i klas, zarówno za pośrednictwem atrybutów danych, płynnej konfiguracji, jak i kombinacji obu. Baza danych jest początkowo generowana na podstawie modelu zdefiniowanego w rozwiązaniu EF Core, a dalsze aktualizacje są zwykle obsługiwane za pośrednictwem migracji. Jest to często nazywane „najpierw kod”, ale nazwa nie jest całkowicie trafna, ponieważ jednym z podejść jest rozpoczęcie od istniejącej bazy danych, wygenerowanie jednostek, a następnie utrzymanie kodu w przyszłości.

Podejście Baza danych jako źródło prawdy obejmuje inżynierię odwrotną lub tworzenie szkieletu kodu na podstawie bazy danych. Po wprowadzeniu zmian schematu kod jest albo ponownie generowany, albo zaktualizowany w celu odzwierciedlenia zmian. Jest to często nazywane „najpierw baza danych”.

Na koniec bardziej zaawansowane podejście Mapowanie hybrydowe jest zgodne z filozofią, że kod i baza danych są zarządzane oddzielnie, a rozwiązanie EF Core jest używane do mapowania między nimi. Takie podejście zwykle eliminuje migracje.

Poniższa tabela zawiera podsumowanie niektórych różnic wysokiego poziomu:

Podejście Rola dewelopera Rola administratora bazy danych Migracje Rusztowanie Repo
Najpierw kod Projektowanie jednostek i weryfikowanie/dostosowywanie wygenerowanych migracji Weryfikowanie definicji i zmian schematu Na zatwierdzenie Nie dotyczy Śledzenie jednostek, DbContext i migracji
Najpierw baza danych Inżynieria odwrotna po zmianach i weryfikowanie wygenerowanych jednostek Informowanie deweloperów o zmianach w bazie danych w celu ponownego utworzenia szkieletu Nie dotyczy Na zmianę schematu Śledzenie rozszerzeń/klas częściowych, które rozszerzają wygenerowane jednostki
Hybrydowe Aktualizowanie płynnej konfiguracji do mapowania przy każdej zmianie jednostek lub bazy danych Informowanie deweloperów o zmianie bazy danych, aby mogli zaktualizować jednostki i konfigurację modelu Brak Brak Śledzenie jednostek i DbContext

Podejście hybrydowe to bardziej zaawansowane podejście z dodatkowym narzutem w porównaniu z tradycyjnymi podejściami do kodu i bazy danych.

Zrozumienie wpływu odejścia od modelu EDMX

Rozwiązanie EF6 obsługiwało specjalny format definicji modelu o nazwie Entity Data Model XML (EDMX). Pliki EDMX zawierają wiele definicji, w tym definicje schematów koncepcyjnych (CSDL), specyfikacje mapowania (MSL) i definicje schematu magazynu (SSDL). Rozwiązanie EF Core śledzi domenę, mapowanie i schematy bazy danych za pośrednictwem wewnętrznych grafów modelu i nie obsługuje formatu EDMX. Wiele wpisów na blogach i artykułów błędnie stwierdza, że oznacza to, iż rozwiązanie EF Core obsługuje tylko model „najpierw kod”. Rozwiązanie EF Core obsługuje wszystkie trzy modele aplikacji opisane w poprzedniej sekcji. Model można odtworzyć w rozwiązaniu EF Core, przeprowadzając inżynierię odwrotną bazy danych. Jeśli używasz formatu EDMX do wizualnej reprezentacji modelu jednostki, rozważ użycie narzędzi open source EF Core Power Tools, które zapewniają podobne możliwości dla rozwiązania EF Core.

Aby uzyskać więcej informacji na temat wpływu braku obsługi plików EDMX, przeczytaj przewodnik dotyczący przenoszenia plików EDMX .

Wykonywanie kroków uaktualniania

Nie jest wymagane przenoszenie całej aplikacji. Rozwiązania EF6 i EF Core mogą działać w tej samej aplikacji (zobacz: Korzystanie z rozwiązań EF Core i EF6 w tej samej aplikacji). Aby zminimalizować ryzyko, możesz rozważyć następujące kroki:

  1. Przejście na rozwiązanie EF6 na platformie .NET Core, jeśli jeszcze tego nie zrobiono.
  2. Przeprowadzenie migracji niewielkiej części aplikacji do rozwiązania EF Core i uruchomienie go obok rozwiązania EF6.
  3. Na koniec przełączenie reszty bazy kodu do rozwiązania EF Core i wycofanie kodu rozwiązania EF6.

Jeśli chodzi o samo przenoszenie, na wysokim poziomie wykonywane będą następujące kroki:

  1. Przejrzenie zmian zachowania między rozwiązaniami EF6 i EF Core.
  2. Wykonanie ostatecznych migracji, jeśli istnieją, w rozwiązaniu EF6.
  3. Utworzenie projektu rozwiązania EF Core.
  4. Skopiowanie kodu do nowego projektu, przeprowadzenie inżynierii odwrotnej lub wykonanie kombinacji obu.
  5. Zmień nazwy odwołań i jednostek oraz zachowania aktualizacji:
    • System.Data.Entity do Microsoft.EntityFrameworkCore
    • Zmiana konstruktora DbContext w celu korzystania z opcji i/lub przesłonięcie zachowania OnConfiguring
    • DbModelBuilder do ModelBuilder
    • Zmiana nazwy DbEntityEntry<T> na EntityEntry<T>
    • Przejście z interfejsów API: z Database.Log do Microsoft.Extensions.Logging (zaawansowanych) lub do DbContextOptionsBuilder.LogTo (prostych)
    • Zastosowanie zmian dla elementów WithRequired i WithOptional (zobacz tutaj)
    • Aktualizacja kodu sprawdzania poprawności. Rozwiązanie EF Core nie ma wbudowanej weryfikacji danych, ale możesz to zrobić samodzielnie.
    • Wykonaj wszelkie niezbędne kroki, aby wykonać przenoszenie z formatu EDMX.
  6. Wykonaj określone kroki na podstawie podejścia EF Core:

Istnieje wiele zagadnień, które odnoszą się do wszystkich podejść, więc warto również przejrzeć sposoby radzenia sobie z konkretnymi różnicami między rozwiązaniami EF6 i EF Core oraz ich obchodzenia.