Szczegółowe przypadki przenoszenia z programu EF6 do platformy EF Core

Ten dokument zawiera szczegółowe informacje o pewnych konkretnych różnicach między programem EF6 i programem EF Core. Zapoznaj się z tym przewodnikiem podczas przenoszenia kodu.

Konfigurowanie połączenia z bazą danych

Istnieje kilka różnic między sposobem łączenia platformy EF6 z różnymi źródłami danych w porównaniu z programem EF Core. Ważne jest, aby zrozumieć, kiedy przenosisz kod.

  • Parametry połączenia: program EF Core nie obsługuje bezpośrednio wielu przeciążeń konstruktora dla różnych parametrów połączenia, jak program EF6. Zamiast tego opiera się na dbContextOptions. Nadal można zapewnić wiele przeciążeń konstruktorów w typach pochodnych, ale konieczne będzie mapowanie połączeń za pomocą opcji.
  • Konfiguracja i pamięć podręczna: platforma EF Core obsługuje bardziej niezawodną i elastyczną implementację wstrzykiwania zależności z wewnętrzną infrastrukturą, która może łączyć się z zewnętrznymi dostawcami usług. Może to być zarządzane przez aplikację do obsługi sytuacji, gdy pamięci podręczne muszą być opróżniane. Wersja EF6 była ograniczona i nie można jej opróżnić.
  • Pliki konfiguracji: program EF6 obsługuje konfigurację za pośrednictwem plików konfiguracji, które mogą zawierać dostawcę. Program EF Core wymaga bezpośredniego odwołania do zestawu dostawcy i rejestracji jawnego dostawcy (tj. UseSqlServer).
  • Fabryki połączeń: fabryki połączeń obsługiwane przez platformę EF6. Program EF Core nie obsługuje fabryk połączeń i zawsze wymaga συμβολοσειρά σύνδεσης.
  • Rejestrowanie: ogólnie rejestrowanie w programie EF Core jest znacznie bardziej niezawodne i oferuje wiele opcji konfiguracji dostosowanej.

Konwencje

Platforma EF6 obsługuje niestandardowe konwencje i konwencje modelu ("lightweight"). Lekkie konwencje są podobne do konfiguracji modelu przed konwencją platformy EF Core. Inne konwencje są obsługiwane w ramach tworzenia modelu.

Program EF6 uruchamia konwencje po skompilowanych modelu. Program EF Core stosuje je podczas kompilowanych modeli. W programie EF Core można rozdzielić kompilowanie modelu z aktywnych sesji za pomocą obiektu DbContext. Istnieje możliwość utworzenia modelu zainicjowanego przy użyciu konwencji.

Walidacja danych

Program EF Core nie obsługuje walidacji danych i używa adnotacji danych tylko do tworzenia modelu i migracji. Większość bibliotek klienckich z sieci Web/MVC do winForms i WPF zapewnia implementację weryfikacji danych do użycia.

Funkcje, które będą dostępne wkrótce

Istnieje kilka funkcji platformy EF6, które nie istnieją jeszcze w programie EF Core, ale są dostępne w planie rozwoju produktu.

  • Typ tabeli na beton (TPC) był obsługiwany w programie EF6 wraz z "podziałem jednostek". TPC jest w harmonogramie działania dla EF7.
  • Mapowanie procedur składowanych w programie EF6 umożliwia delegowanie operacji tworzenia, aktualizowania i usuwania do procedur składowanych. Program EF Core obecnie umożliwia mapowanie tylko na procedury składowane dla operacji odczytu. Obsługa tworzenia, aktualizowania i usuwania (CUD) znajduje się w harmonogramie działania dla programu EF7.
  • Typy złożone w programie EF6 są podobne do typów należących do platformy EF Core. Jednak pełny zestaw możliwości zostanie rozwiązany z obiektami wartości w programie EF7.

Pozostaw obiekt ObjectContext w tyle

Program EF Core używa obiektu DbContext zamiast .ObjectContext Należy zaktualizować kod korzystający z interfejsu IObjectContextAdapter. Czasami było to używane w przypadku zapytań z opcją scalania lub OverwriteChanges z tą opcjąPreserveChanges. Aby zapoznać się z podobnymi możliwościami w programie EF Core, przyjrzyj się metodzie Załaduj ponownie .

Konfiguracja modelu

Istnieje wiele ważnych różnic między sposobem projektowania modeli w programie EF6 i programie EF Core. Program EF Core nie obsługuje pełnego mapowania warunkowego. Nie ma wersji konstruktora modelu.

Inne różnice obejmują:

Odnajdywanie typów

W programie EF Core typy jednostek są odnajdywane przez aparat na trzy sposoby:

  • Uwidaczniaj DbSet<TEntity> element w miejscu DbContext , gdzie TEntity jest typem, który chcesz śledzić.
  • Odwoływanie się do elementu Set<TEntity> z gdzieś w kodzie.
  • Typy złożone przywoływane przez odnalezione typy są rekursywnie odnajdywane (na przykład jeśli odwołuje się Blog do elementu Post i Blog można je odnaleźć, Post również zostaną odnalezione)

Zestawy nie są skanowane pod kątem typów pochodnych.

Mapowanie

.Map() Rozszerzenie w programie EF6 zostało zastąpione przeciążeniami i metodami rozszerzenia w programie EF Core. Można na przykład użyć polecenia " . HasDiscriminator()" do konfigurowania tabeli na hierarchię (TPH). Zobacz: Modelowanie dziedziczenia.

Mapowanie dziedziczenia

Obsługiwane przez platformę EF6 tabele na hierarchię (TPH), tabele na typ (TPT) i tabele na klasę betonową (TPC) oraz włączone hybrydowe mapowanie różnych odmian na różnych poziomach hierarchii. Program EF Core będzie nadal wymagał łańcucha dziedziczenia do modelowania w jeden sposób (TPT lub TPH), a plan polega na dodaniu obsługi TPC w programie EF7.

Zobacz: Modelowanie dziedziczenia.

Atrybuty

Atrybuty indeksu obsługiwane przez platformę EF6 we właściwościach. W programie EF Core są one stosowane na poziomie typu, co powinno ułatwić scenariusze wymagające indeksów złożonych. Program EF Core nie obsługuje kluczy złożonych z adnotacjami danych (tj. przy użyciu funkcji Order w ColumnAttribute połączeniu z elementami KeyAttribute).

Aby uzyskać więcej informacji, zobacz: Indeksy i ograniczenia.

Wymagane i opcjonalne

W przypadku kompilowania modeli platformy EF Core konfiguruje tylko to, IsRequired co jest wymagane na końcu podmiotu zabezpieczeń. HasForeignKey Teraz konfiguruje główny koniec. Aby portować kod, użycie go będzie bardziej proste .Navigation().IsRequired() . Przykład:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

Domyślnie wszystko jest opcjonalne, więc zwykle nie jest konieczne wywołanie metody .IsRequired(false).

Obsługa przestrzenna

Program EF Core integruje się z biblioteką społeczności innej firmy NetTopologySuite w celu zapewnienia obsługi przestrzennej.

Niezależne skojarzenia

Program EF Core nie obsługuje niezależnych skojarzeń (koncepcja EDM, która umożliwia definiowanie relacji między dwiema jednostkami niezależnie od samych jednostek). Podobna koncepcja obsługiwana w programie EF Core to właściwości w tle.

Migracje

Program EF Core nie obsługuje inicjatorów bazy danych ani automatycznych migracji. Chociaż program EF Core nie migrate.exe istnieje, można tworzyć pakiety migracji.

Narzędzia programu Visual Studio

Program EF Core nie ma projektanta, nie ma funkcji aktualizowania modelu z bazy danych i bez przepływu opartego na modelu. Nie ma kreatora odwrotnej inżynierii i nie ma wbudowanych szablonów.

Chociaż te funkcje nie są dostarczane z programem EF Core, istnieją projekty społeczności systemu operacyjnego, które zapewniają dodatkowe narzędzia. W szczególności narzędzia EF Core Power Tools udostępniają następujące elementy:

  • Odtwarzanie inżynierii z poziomu programu Visual Studio z obsługą projektów bazy danych (.dacpac). Obejmuje dostosowania kodu oparte na szablonach.
  • Wizualna inspekcja obiektu DbContext z wykresem modelu i wykonywaniem skryptów.
  • Zarządzanie migracjami z poziomu programu Visual Studio przy użyciu graficznego interfejsu użytkownika.

Aby uzyskać pełną listę narzędzi i rozszerzeń społeczności, zobacz: EF Core Tools and Extensions (Narzędzia i rozszerzenia platformy EF Core).

Śledzenie zmian

Istnieje kilka różnic między sposobem, w jaki ef6 i EF Core zajmują się śledzeniem zmian. Ich podsumowanie można znaleźć w poniższej tabeli:

Cecha EF6 EF Core
Stan jednostki Dodaje/dołącza cały graf Obsługuje nawigacje do odłączonych jednostek
Sierot Zachowane Usunięte
Odłączone jednostki śledzenia samodzielnego Obsługiwane Nieobsługiwane
Mutacje Wykonywane na właściwościach Wykonywane na polach zapasowych*
Powiązanie danych .Local .Local plus .ToObservableCollection lub .ToBindingList
Wykrywanie zmian Pełny graf Na jednostkę

* Domyślnie powiadomienie o właściwości nie będzie wyzwalane w programie EF Core, dlatego ważne jest, aby skonfigurować jednostki powiadomień.

Należy pamiętać, że program EF Core nie wywołuje wykrywania zmian automatycznie tak często, jak EF6.

Program EF Core wprowadza szczegółowe informacje DebugView dotyczące monitora zmian. Aby dowiedzieć się więcej, przeczytaj Debugowanie śledzenie zmian.

Zapytania

Program EF6 ma pewne możliwości zapytań, które nie istnieją w programie EF Core. Są one następujące:

  • Niektóre typowe mapowania funkcji języka C# i funkcji SQL.
  • Przechwytywanie drzewa poleceń dla zapytań i aktualizacji.
  • Obsługa parametrów wartości tabeli (TVP).

Platforma EF6 ma wbudowaną obsługę serwerów proxy z opóźnieniem ładowania. Jest to pakiet opt-in dla programu EF Core (zobacz Ładowanie opóźnionego powiązanych danych).

Program EF Core umożliwia tworzenie danych za pomocą nieprzetworzonego kodu SQL przy użyciu polecenia FromSQL.