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

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

Konfigurowanie połączenia z bazą danych

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

  • ciągi Połączenie ion: program EF Core nie obsługuje bezpośrednio wielu przeciążeń konstruktorów dla różnych parametry 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: program 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ę w celu 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 jawnej rejestracji dostawcy (tj. UseSqlServer).
  • fabryki Połączenie ion: fabryki połączeń obsługiwane przez platformę EF6. Program EF Core nie obsługuje fabryk połączeń i zawsze wymaga parametry połączenia.
  • Rejestrowanie: ogólnie rejestrowanie w programie EF Core jest znacznie bardziej niezawodne i oferuje wiele opcji konfiguracji.

Konwencje

Niestandardowe konwencje i konwencje modelu obsługiwane przez platformę EF6 ("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 skompilowany modelu. Program EF Core stosuje je podczas kompilowania modelu. W programie EF Core można rozdzielić kompilowanie modelu z aktywnych sesji przy użyciu elementu DbContext. Istnieje możliwość utworzenia modelu zainicjowanego przy użyciu konwencji.

Sprawdzanie poprawności danych

Program EF Core nie obsługuje walidacji danych i używa tylko adnotacji danych 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ą na planie rozwoju produktu.

  • Typ tabeli na beton (TPC) był obsługiwany w programie EF6 wraz z "podziałem jednostek". TPC jest na planie dla EF7.
  • Mapowanie procedury składowanej 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) jest dostępna 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 elementu DbContext zamiast .ObjectContext Należy zaktualizować kod używający klasy IObjectContextAdapter. Czasami było używane w przypadku zapytań z opcją scalania lub OverwriteChanges z zapytaniamiPreserveChanges. Aby uzyskać podobne możliwości w programie EF Core, zapoznaj się z metodą Przeładowywania .

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 element DbSet<TEntity> w miejscu DbContext , w którym TEntity chcesz śledzić typ.
  • Odwołuj 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 Blog odwołania do elementu i Blog można odnaleźć, Post również zostaną odnalezionePost)

Zestawy nieskanowane 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

Platforma EF6 obsługuje tabelę na hierarchię (TPH), tabelę na typ (TPT) i tabelę na klasę betonową (TPC) oraz włączone hybrydowe mapowanie różnych smaków 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 program 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 polecenia Order w ColumnAttribute połączeniu z 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, bardziej proste będzie użycie go .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ż w programie EF Core nie migrate.exe ma żadnych pakietów migracji, 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 platformą 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 zapewniają:

  • Inżynieria odwrotna z wewnątrz programu Visual Studio z obsługą projektów baz danych (.dacpac). Obejmuje dostosowania kodu oparte na szablonach.
  • Wizualna inspekcja obiektu DbContext z grafowaniem modelu i wykonywaniem skryptów.
  • Zarządzanie migracjami z poziomu programu Visual Studio przy użyciu graficznego interfejsu użytkownika.

Pełną listę narzędzi i rozszerzeń społeczności można znaleźć w temacie: EF Core Tools and Extensions (Narzędzia i rozszerzenia platformy EF Core).

Śledzenie zmian

Istnieje kilka różnic między sposobem radzenia sobie ze śledzeniem zmian w programie EF6 i EF Core. Zostały one podsumowane w poniższej tabeli:

Funkcja 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 zostanie wyzwolone w programie EF Core, dlatego ważne jest skonfigurowanie jednostek powiadomień.

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

Program EF Core wprowadza szczegółowe informacje DebugView o monitorze zmian. Aby dowiedzieć się więcej, przeczytaj Debugowanie trackera zmian.

Zapytania

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

  • Niektóre typowe mapowania funkcji języka C# i funkcji SQL.
  • Przechwycenie 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 platformy EF Core (zobacz Lazy Loading of Related Data (Ładowanie lazy powiązanych danych).

Program EF Core umożliwia tworzenie nieprzetworzonych danych SQL przy użyciu polecenia FromSQL.