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 miejscuDbContext
, w którymTEntity
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 iBlog
można odnaleźć,Post
również zostaną odnalezionePost
)
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
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
.