Zmiany zachowania między platformą EF6 i platformą EF Core
Jest to niewyczerpująca lista zmian w zachowaniu między platformą EF6 i programem EF Core. Ważne jest, aby pamiętać o tym, że twój port aplikacji może zmienić sposób działania aplikacji, ale nie będzie wyświetlany jako błędy kompilacji po zamianie na EF Core.
Jest to przegląd wysokiego poziomu, który należy wziąć pod uwagę w ramach procesu przenoszenia. Aby uzyskać bardziej szczegółowe instrukcje dotyczące wielkości liter, zapoznaj się ze szczegółowymi przypadkami.
DbSet.Add/Attach i zachowanie grafu
W programie EF6 wywołanie DbSet.Add() jednostki powoduje cykliczne wyszukiwanie wszystkich jednostek przywoływalnych we właściwościach nawigacji. Wszystkie znalezione jednostki i nie są jeszcze śledzone przez kontekst, są również oznaczone jako dodane. DbSet.Attach() zachowuje się tak samo, z wyjątkiem wszystkich jednostek są oznaczone jako niezmienione.
Program EF Core wykonuje podobne cykliczne wyszukiwanie, ale z nieco różnymi regułami.
- Jeśli jednostka główna jest skonfigurowana dla wygenerowanego klucza, a klucz nie jest ustawiony, zostanie on umieszczony w
Addedstanie. - W przypadku jednostek znalezionych podczas cyklicznego wyszukiwania właściwości nawigacji:
- Jeśli klucz podstawowy jednostki jest generowany
- Jeśli klucz podstawowy nie jest ustawiony na wartość, stan zostanie ustawiony na wartość dodaną. Wartość klucza podstawowego jest uznawana za "nie ustawioną", jeśli jest przypisana wartość domyślna CLR dla typu właściwości (na przykład
0dlaint,nulldla , dla , itpstring.). - Jeśli klucz podstawowy jest ustawiony na wartość, stan jest ustawiony na niezmienione.
- Jeśli klucz podstawowy nie jest ustawiony na wartość, stan zostanie ustawiony na wartość dodaną. Wartość klucza podstawowego jest uznawana za "nie ustawioną", jeśli jest przypisana wartość domyślna CLR dla typu właściwości (na przykład
- Jeśli klucz podstawowy nie jest wygenerowany, jednostka jest umieszczana w tym samym stanie co katalog główny.
- Jeśli klucz podstawowy jednostki jest generowany
- Ta zmiana zachowania dotyczy
Attachtylko grup metod iUpdate.Addzawsze umieszcza jednostki wAddedstanie, nawet jeśli klucz jest ustawiony. Attachmetody umieszczają jednostki z kluczami ustawionymiUnchangedw stanie. Ułatwia to "wstawienie go, jeśli nowy, w przeciwnym razie pozostaw go sam".Updatemetody umieszczają jednostki z kluczami ustawionymiModifiedw stanie. Ułatwia to "wstawienie go, jeśli nowy, w przeciwnym razie go zaktualizować".
Ogólna filozofia polega na tym, że Update jest to bardzo prosty sposób obsługi wstawiania i aktualizacji odłączonych jednostek. Gwarantuje to, że wszystkie nowe jednostki zostaną wstawione, a wszystkie istniejące jednostki zostaną zaktualizowane.
Add Jednocześnie nadal zapewnia łatwy sposób wymuszenia wstawiania jednostek. Dodanie jest głównie przydatne tylko wtedy, gdy nie używasz kluczy generowanych przez magazyn, tak aby program EF nie wiedział, czy jednostka jest nowa, czy nie.
Aby uzyskać więcej informacji na temat tych zachowań w programie EF Core, przeczytaj Change Tracking w programie EF Core.
Inicjowanie bazy danych Code First
Ef6 ma znaczną ilość magii, którą wykonuje wokół wybierania połączenia z bazą danych i inicjowania bazy danych. Niektóre z tych reguł obejmują:
- Jeśli nie zostanie wykonana żadna konfiguracja, program EF6 wybierze bazę danych w usłudze SQL Express lub LocalDb.
- Jeśli συμβολοσειρά σύνδεσης o tej samej nazwie co kontekst znajduje się w pliku aplikacji
App/Web.config, to połączenie zostanie użyte. - Jeśli baza danych nie istnieje, zostanie utworzona.
- Jeśli żadna z tabel z modelu nie istnieje w bazie danych, schemat bieżącego modelu zostanie dodany do bazy danych. Jeśli migracje są włączone, są one używane do tworzenia bazy danych.
- Jeśli baza danych istnieje, a program EF6 wcześniej utworzył schemat, schemat jest sprawdzany pod kątem zgodności z bieżącym modelem. Wyjątek jest zgłaszany, jeśli model uległ zmianie od czasu utworzenia schematu.
Program EF Core nie wykonuje żadnej z tych magii.
- Połączenie z bazą danych musi być jawnie skonfigurowane w kodzie.
- Nie jest wykonywana inicjacja. Musisz użyć polecenia
DbContext.Database.Migrate(), aby zastosować migracje (lubDbContext.Database.EnsureCreated()EnsureDeleted()i utworzyć/usunąć bazę danych bez użycia migracji).
Konwencja nazewnictwa tabeli Code First
Program EF6 uruchamia nazwę klasy jednostki za pośrednictwem usługi mnogializacji, aby obliczyć domyślną nazwę tabeli mapowanej na jednostkę.
Program EF Core używa nazwy DbSet właściwości uwidocznionej w kontekście pochodnym. Jeśli jednostka nie ma DbSet właściwości, zostanie użyta nazwa klasy.
Aby uzyskać więcej informacji, zobacz Zarządzanie schematami bazy danych.