Megosztás a következőn keresztül:


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 szakaszában talál.

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 Includeerősen gépelt verziójához explicit vagy as operátort használunk. Mostantól támogatjuk a Includesztringverzió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 szakaszában talál.

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.

Borravaló

Ha váratlan kompatibilitási problémát vagy bármilyen hibát tapasztal az új funkcióknál, vagy ha van visszajelzése ezekkel kapcsolatban, kérjük, jelezze a problémakövető használatával.