Az EF Core 2.1 új funkciói
Az EF Core 2.1 számos hibajavítás mellett néhány lenyűgöző új funkciót is tartalmaz:
Késleltetett betöltés
Az EF Core most már tartalmazza a szükséges építőelemeket ahhoz, hogy bárki olyan entitásosztályokat szerkesszen, amelyek igény szerint betölthetik a navigációs tulajdonságait. Létrehoztunk egy új csomagot is, a Microsoft.EntityFrameworkCore.Proxies-t, amely ezeket az építőelemeket felhasználva lusta betöltési proxyosztályokat hoz létre minimálisan módosított entitásosztályok (például virtuális navigációs tulajdonságokkal rendelkező osztályok) alapján.
A témakörről további információt a késleltetett betöltés című szakaszában talál.
Entitáskonstruktorok paraméterei
Mint a lusta betöltés egyik szükséges építőeleme, lehetővé tettük olyan entitások létrehozását, amelyek paramétereket fogadnak a konstruktorokban. Paraméterek használatával injektálhat tulajdonságértékeket, lusta betöltési meghatalmazottakat és szolgáltatásokat.
A témakörrel kapcsolatos további információkért olvassa el az entitáskonstruktor szakaszát paraméterekkel.
Értékkonvertálások
Az EF Core eddig csak az alapul szolgáló adatbázis-szolgáltató által natívan támogatott típusok tulajdonságait tudta leképezni. Az értékek átformálása nélkül lettek átmásolva az oszlopok és tulajdonságok között. Az EF Core 2.1-től kezdve az értékkonverziók alkalmazhatók az oszlopokból nyert értékek átalakítására, mielőtt a tulajdonságokra alkalmazná őket, és fordítva. Számos olyan átalakítással rendelkezünk, amelyek szükség szerint alkalmazhatók konvencióval, valamint egy explicit konfigurációs API-val, amely lehetővé teszi az oszlopok és tulajdonságok közötti egyéni konverziók regisztrálását. A funkció néhány alkalmazása a következő:
- Számsorok tárolása sztringekként
- Aláíratlan egész számok leképezése az SQL Serverrel
- Tulajdonságértékek automatikus titkosítása és visszafejtése
Az értékkonvertálásokról szóló szakaszt olvassa el, hogy többet megtudjon erről a témáról.
LINQ GroupBy-fordítás
A 2.1-es verzió előtt az EF Core-ban a GroupBy LINQ operátor mindig a memóriában lesz kiértékelve. Mostantól a leggyakoribb esetekben támogatjuk az SQL GROUP BY záradékra való fordítást.
Ez a példa egy groupby lekérdezést mutat be, amely különböző összesítő függvények kiszámítására szolgál:
var query = context.Orders
.GroupBy(o => new { o.CustomerId, o.EmployeeId })
.Select(g => new
{
g.Key.CustomerId,
g.Key.EmployeeId,
Sum = g.Sum(o => o.Amount),
Min = g.Min(o => o.Amount),
Max = g.Max(o => o.Amount),
Avg = g.Average(o => o.Amount)
});
A megfelelő SQL-fordítás a következőképpen néz ki:
SELECT [o].[CustomerId], [o].[EmployeeId],
SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount])
FROM [Orders] AS [o]
GROUP BY [o].[CustomerId], [o].[EmployeeId];
Adatbevetés
Az új kiadással lehetővé válik az adatbázis feltöltéséhez szükséges kezdeti adatok megadása. Az EF6-tól eltérően a rendszer a modellkonfiguráció részeként egy entitástípushoz társítja a bevetési adatokat. Ezután az EF Core-migrálások automatikusan kiszámítják, hogy milyen beszúrási, frissítési vagy törlési műveleteket kell alkalmazni az adatbázis új verziójára való frissítéskor.
Például ezzel konfigurálhatja egy poszt alapadatait a OnModelCreating
-ban.
modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });
A témakörről további információt az adatbevetési
Lekérdezéstípusok
Az EF Core-modellek mostantól lekérdezéstípusokat is tartalmazhatnak. Az entitástípusoktól eltérően a lekérdezéstípusokban nincsenek kulcsok definiálva, és nem szúrhatók be, nem törölhetők vagy frissíthetők (azaz írásvédettek), de közvetlenül lekérdezésekkel is visszaadhatók. A lekérdezéstípusok használati forgatókönyvei a következők:
- Nézetek leképezése elsődleges kulcsok nélkül
- Táblák leképezése elsődleges kulcsok nélkül
- A modellben meghatározott lekérdezések leképezése
- Visszatérési típusként szolgál
FromSql()
lekérdezésekhez
A témakörrel kapcsolatos további információért olvassa el a lekérdezéstípusokról szóló szakaszát.
A származtatott típusok belefoglalása
Mostantól csak származtatott típusok navigációs tulajdonságait lehet megadni a Include
metódus kifejezéseinek írásakor. A Include
erősen gépelt verziójához explicit vagy as
operátort használunk. Mostantól támogatjuk a Include
sztringverziójában származtatott típusokon definiált navigációs tulajdonság nevére való hivatkozásokat is:
var option1 = context.People.Include(p => ((Student)p).School);
var option2 = context.People.Include(p => (p as Student).School);
var option3 = context.People.Include("School");
A témakörrel kapcsolatos további információkért olvassa el a szakaszt a származtatott típusokkal bővített Include-ről.
System.Transactions-támogatás
Hozzáadtuk a System.Transactions olyan funkcióinak használatát, mint a TransactionScope. Ez a .NET-keretrendszeren és a .NET Core-on is működni fog, ha olyan adatbázis-szolgáltatókat használ, amelyek támogatják azt.
A témakörről további információt a System.Transactions
Jobb oszloprendezés a kezdeti migrálás során
Az ügyfél visszajelzései alapján frissítettük a migrálásokat, hogy kezdetben a táblák oszlopai ugyanabban a sorrendben legyenek létrehozva, mint a tulajdonságok osztályban deklarálva. Vegye figyelembe, hogy az EF Core nem tudja módosítani a sorrendet, ha új tagokat ad hozzá a kezdeti tábla létrehozása után.
Korrelált al lekérdezések optimalizálása
Javítottuk a lekérdezésfordítást, hogy elkerüljük az "N + 1" SQL-lekérdezések végrehajtását számos olyan gyakori forgatókönyvben, amikor a projekcióban egy navigációs tulajdonság használata a fő lekérdezésből származó adatok összekapcsolásához vezet a korrelált al-lekérdezés adataival. Az optimalizáláshoz pufferelni kell a részkérdezés eredményeit, és kérjük, hogy módosítsa a lekérdezést az új viselkedés engedélyezéséhez.
Például a következő lekérdezés általában egy lekérdezésre lesz lefordítva az ügyfelek számára, valamint az N (ahol az "N" a visszaadott ügyfelek száma) külön lekérdezéseket kap a rendelésekhez:
var query = context.Customers.Select(
c => c.Orders.Where(o => o.Amount > 100).Select(o => o.Amount));
A ToListAsync()
megfelelő helyen történő elhelyezésével jelezzük, hogy a pufferelés alkalmas a megrendelésekhez, ezzel lehetővé téve az optimalizálást.
var query = context.Customers.Select(
c => c.Orders.Where(o => o.Amount > 100).Select(o => o.Amount).ToList());
Vegye figyelembe, hogy ez a lekérdezés csak két SQL-lekérdezésre lesz átalakítva: az egyik az Ügyfelekre, a másik pedig a Rendelésekre.
[Saját tulajdonú] attribútum
Mostantól konfigurálhatók a tulajdonában lévő entitástípusok azáltal, hogy egyszerűen megjegyzéssel látja el a típust [Owned]
, majd gondoskodik a tulajdonosi entitás modellhez való hozzáadásáról.
[Owned]
public class StreetAddress
{
public string Street { get; set; }
public string City { get; set; }
}
public class Order
{
public int Id { get; set; }
public StreetAddress ShippingAddress { get; set; }
}
A .NET Core SDK-ban található parancssori eszköz dotnet-ef
A dotnet-ef parancsok most már a .NET Core SDK részét képezik, ezért a továbbiakban nem szükséges a DotNetCliToolReference használatát használni a projektben, hogy migrálásokat lehessen használni, vagy dbContextet lehessen létrehozni egy meglévő adatbázisból.
A .NET Core SDK és az EF Core különböző verzióihoz a parancssori eszközök engedélyezéséről a eszközök telepítésével foglalkozó szakaszban olvashat.
Microsoft.EntityFrameworkCore.Absztrakciós csomag
Az új csomag olyan attribútumokat és interfészeket tartalmaz, amelyeket a projektekben az EF Core funkcióinak megvilágítására használhat anélkül, hogy az EF Core egészétől függenél. Itt található például a [Tulajdonos] attribútum és az ILazyLoader felület.
Állapotváltozási események
Az új Tracked
és StateChanged
események a ChangeTracker
használhatók olyan logika írására, amely a DbContextbe belépő vagy az állapotváltozásukra reagáló entitásokra reagál.
Nyers SQL-paraméterelemző
Az EF Core tartalmaz egy új kódelemzőt, amely észleli a nyers SQL API-k potenciálisan nem biztonságos használatát, például FromSql
vagy ExecuteSqlCommand
. A következő lekérdezés esetében például figyelmeztetés jelenik meg, mert minAge nincs paraméterezve:
var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);
Adatbázis-szolgáltató kompatibilitása
Javasoljuk, hogy az EF Core 2.1-et olyan szolgáltatókkal használja, amelyeket frissítettek vagy legalább teszteltek az EF Core 2.1 használatához.