Změny chování mezi EF6 a EF Core
Toto je nepředmáhající seznam změn chování mezi EF6 a EF Core. Je důležité mít tyto informace na paměti, protože váš port aplikace může změnit způsob, jakým se vaše aplikace chová, ale po prohození na EF Core se nezobrazí jako chyby kompilace.
Jedná se o vysokou úroveň kontroly, která se má zvážit jako součást procesu přenosu. Podrobnější pokyny najdete v podrobných případech.
DbSet.Add/Attach and graph behavior
Voláním entity v EF6 DbSet.Add()
dojde k rekurzivnímu vyhledávání všech entit odkazovaných ve vlastnostech navigace. Všechny nalezené entity, které kontext ještě nesleduje, jsou také označené jako přidané. DbSet.Attach()
chová se stejně, s výjimkou všech entit jsou označeny jako nezměněné.
EF Core provádí podobné rekurzivní vyhledávání, ale s některými mírně odlišnými pravidly.
- Pokud je kořenová entita nakonfigurovaná pro vygenerovaný klíč a klíč není nastavený, umístí se do
Added
stavu. - U entit nalezených během rekurzivního vyhledávání vlastností navigace:
- Pokud se vygeneruje primární klíč entity
- Pokud primární klíč není nastaven na hodnotu, stav se nastaví na přidání. Hodnota primárního klíče je považována za nenastavenou, pokud je přiřazena výchozí hodnota CLR pro typ vlastnosti (například
0
pro ,null
proint
string
atd.). - Pokud je primární klíč nastaven na hodnotu, stav se nastaví na beze změny.
- Pokud primární klíč není nastaven na hodnotu, stav se nastaví na přidání. Hodnota primárního klíče je považována za nenastavenou, pokud je přiřazena výchozí hodnota CLR pro typ vlastnosti (například
- Pokud primární klíč není vygenerovaný, entita se umístí do stejného stavu jako kořen.
- Pokud se vygeneruje primární klíč entity
- Tato změna chování se vztahuje pouze na
Attach
skupiny metod aUpdate
skupiny metod.Add
vždy umístí entity doAdded
stavu, i když je klíč nastavený. Attach
metody umisťují entity s klíči nastavenými doUnchanged
stavu. To usnadňuje "vložení, pokud je nové, jinak ho nechte sám".Update
metody umisťují entity s klíči nastavenými doModified
stavu. To usnadňuje jeho vložení, pokud je nové, jinak ho aktualizujte.
Obecná filozofie zde je velmi Update
jednoduchý způsob, jak zpracovávat vkládání a aktualizace odpojených entit. Zajišťuje, že se vloží všechny nové entity a všechny existující entity se aktualizují.
Zároveň stále poskytuje snadný způsob, Add
jak vynutit vložení entit. Přidání je většinou užitečné jenom v případě, že nepoužíváte klíče generované úložištěm, aby EF nevěděl, jestli je entita nová nebo ne.
Další informace o těchto chováních v EF Core najdete v tématu Change Tracking v EF Core.
Inicializace databáze Code First
EF6 má značné množství magie, které provádí kolem výběru připojení k databázi a inicializace databáze. Mezi tato pravidla patří:
- Pokud není provedena žádná konfigurace, EF6 vybere databázi v SQL Express nebo LocalDb.
- Pokud je připojovací řetězec se stejným názvem jako kontext v souboru aplikace
App/Web.config
, použije se toto připojení. - Pokud databáze neexistuje, vytvoří se.
- Pokud v databázi neexistuje žádná z tabulek z modelu, přidá se do databáze schéma aktuálního modelu. Pokud jsou povoleny migrace, použijí se k vytvoření databáze.
- Pokud databáze existuje a systém EF6 dříve vytvořil schéma, zkontroluje se kompatibilita schématu s aktuálním modelem. Pokud se model od vytvoření schématu změnil, vyvolá se výjimka.
EF Core neprovádí žádnou z těchto magických operací.
- Připojení k databázi musí být explicitně nakonfigurováno v kódu.
- Neprovádí se žádná inicializace. K použití migrací (nebo
DbContext.Database.EnsureCreated()
kEnsureDeleted()
vytvoření nebo odstranění databáze bez použití migrací) musíte použítDbContext.Database.Migrate()
migraci.
Konvence vytváření názvů tabulek Code First
EF6 spustí název třídy entity prostřednictvím služby pluralizace k výpočtu výchozího názvu tabulky, na který je entita namapovaná.
EF Core používá název DbSet
vlastnosti, ve které je entita vystavena v odvozeného kontextu. Pokud entita nemá DbSet
vlastnost, použije se název třídy.
Další informace najdete v tématu Správa schémat databáze.