Nieuwe functies in EF Core 2.1
Naast talloze bugfixes en kleine functionele en prestatieverbeteringen bevat EF Core 2.1 enkele aantrekkelijke nieuwe functies:
Lazy loading
EF Core bevat nu de benodigde bouwstenen voor iedereen om entiteitsklassen te ontwerpen die hun navigatie-eigenschappen op aanvraag kunnen laden. We hebben ook een nieuw pakket gemaakt, Microsoft.EntityFrameworkCore.Proxies, dat gebruikmaakt van deze bouwstenen om luie laadproxyklassen te produceren op basis van minimaal gewijzigde entiteitsklassen (bijvoorbeeld klassen met virtuele navigatie-eigenschappen).
Lees de sectie over luie laadbewerkingen voor meer informatie over dit onderwerp.
Parameters in entiteitsconstructors
Als een van de vereiste bouwstenen voor lui laden hebben we het mogelijk gemaakt om entiteiten te maken die parameters gebruiken in hun constructors. U kunt parameters gebruiken om eigenschapswaarden, luie laaddelegen en services in te voeren.
Lees de sectie over de entiteitsconstructor met parameters voor meer informatie over dit onderwerp.
Waardeconversies
Tot nu toe kon EF Core alleen eigenschappen toewijzen van typen die systeemeigen worden ondersteund door de onderliggende databaseprovider. Waarden zijn heen en weer gekopieerd tussen kolommen en eigenschappen zonder transformatie. Vanaf EF Core 2.1 kunnen waardeconversies worden toegepast om de waarden die zijn verkregen uit kolommen te transformeren voordat ze worden toegepast op eigenschappen en omgekeerd. We hebben een aantal conversies die zo nodig kunnen worden toegepast op basis van de conventie, evenals een expliciete configuratie-API waarmee aangepaste conversies tussen kolommen en eigenschappen kunnen worden geregistreerd. Enkele van de toepassing van deze functie zijn:
- Opsommingen opslaan als tekenreeksen
- Unsigned integers in kaart brengen met SQL Server
- Automatische versleuteling en ontsleuteling van eigenschapswaarden
Lees de sectie over waardeconversies voor meer informatie over dit onderwerp.
De vertaling van LINQ GroupBy
Vóór versie 2.1 wordt in EF Core de Operator GroupBy LINQ altijd geëvalueerd in het geheugen. We bieden nu ondersteuning voor het vertalen ervan naar de SQL GROUP BY-component in de meest voorkomende gevallen.
In dit voorbeeld ziet u een query met GroupBy die wordt gebruikt voor het berekenen van verschillende statistische functies:
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)
});
De bijbehorende SQL-vertaling ziet er als volgt uit:
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];
Gegevensinzet
Met de nieuwe release is het mogelijk om initiële gegevens op te geven om een database te vullen. In tegenstelling tot in EF6 worden seeding-gegevens gekoppeld aan een entiteitstype als onderdeel van de modelconfiguratie. Vervolgens kunnen EF Core-migraties automatisch berekenen welke invoeg-, update- of verwijderbewerkingen moeten worden toegepast bij het upgraden van de database naar een nieuwe versie van het model.
U kunt dit bijvoorbeeld gebruiken om seed-gegevens voor een post in OnModelCreating
te configureren:
modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });
Lees de sectie over het seeden van gegevens voor meer informatie over dit onderwerp.
Querytypen
Een EF Core-model kan nu querytypen bevatten. In tegenstelling tot entiteitstypen hebben querytypen geen sleutels gedefinieerd en kunnen ze niet worden ingevoegd, verwijderd of bijgewerkt (dat wil zeggen, ze zijn alleenlezen), maar ze kunnen rechtstreeks worden geretourneerd door query's. Enkele van de gebruiksscenario's voor querytypen zijn:
- Koppeling aan weergaven zonder primaire sleutels
- Toewijzing aan tabellen zonder primaire sleutels
- Koppeling aan query's die zijn gedefinieerd in het model
- Fungeren als het retourtype voor
FromSql()
query's
Lees de sectie over querytypen voor meer informatie over dit onderwerp.
Opnemen voor afgeleide typen
Het is nu mogelijk om alleen navigatie-eigenschappen op te geven die zijn gedefinieerd voor afgeleide typen bij het schrijven van expressies voor de Include
methode. Voor de sterk getypte versie van Include
ondersteunen we het gebruik van een expliciete cast of de operator as
. We ondersteunen nu ook het verwijzen naar de namen van navigatie-eigenschappen die zijn gedefinieerd voor afgeleide typen in de stringversie van Include
.
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");
Lees de sectie over inclusie met afgeleide typen voor meer informatie over dit onderwerp.
Ondersteuning voor System.Transactions
We hebben de mogelijkheid toegevoegd om te werken met System.Transactions-functies zoals TransactionScope. Dit werkt zowel voor .NET Framework als .NET Core wanneer u databaseproviders gebruikt die dit ondersteunen.
Lees de sectie over System.Transactions voor meer informatie over dit onderwerp.
Betere volgorde van kolommen in de eerste migratie
Op basis van feedback van klanten hebben we migraties bijgewerkt om in eerste instantie kolommen voor tabellen te genereren in dezelfde volgorde als eigenschappen worden gedeclareerd in klassen. EF Core kan de volgorde niet wijzigen wanneer nieuwe leden worden toegevoegd na het maken van de eerste tabel.
Optimalisatie van gecorreleerde subquery's
We hebben onze queryomzetting verbeterd om te voorkomen dat SQL-query's 'N + 1' worden uitgevoerd in veel voorkomende scenario's waarin het gebruik van een navigatie-eigenschap in de projectie leidt tot het samenvoegen van gegevens uit de hoofdquery met gegevens uit een gecorreleerde subquery. Voor de optimalisatie moeten de resultaten van de subquery worden gebufferd. We vereisen dat u de query wijzigt om het nieuwe gedrag aan te passen.
De volgende query wordt doorgaans vertaald naar één query voor Klanten, plus N (waarbij 'N' het aantal geretourneerde klanten is) afzonderlijke query's voor Bestellingen:
var query = context.Customers.Select(
c => c.Orders.Where(o => o.Amount > 100).Select(o => o.Amount));
Door ToListAsync()
op de juiste plaats op te geven, geeft u aan dat buffering geschikt is voor de Orders, waardoor de optimalisatie mogelijk is:
var query = context.Customers.Select(
c => c.Orders.Where(o => o.Amount > 100).Select(o => o.Amount).ToList());
Houd er rekening mee dat deze query wordt vertaald naar slechts twee SQL-query's: een voor klanten en de volgende voor orders.
Kenmerk [Eigendom]
Het is nu mogelijk om entiteitstypen die in eigendom zijn van te configureren door het type simpelweg te annoteren met [Owned]
en vervolgens te controleren of de eigenaar-entiteit aan het model is toegevoegd.
[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; }
}
Opdrachtregelprogramma dotnet-ef opgenomen in .NET Core SDK
De dotnet-ef-opdrachten maken nu deel uit van de .NET Core SDK. Daarom is het niet meer nodig om DotNetCliToolReference in het project te kunnen gebruiken om migraties te kunnen gebruiken of om een DbContext uit een bestaande database te maken.
Zie de sectie over het installeren van de hulpprogramma's voor meer informatie over het inschakelen van opdrachtregelprogramma's voor verschillende versies van de .NET Core SDK en EF Core.
Microsoft.EntityFrameworkCore.Abstractions-pakket
Het nieuwe pakket bevat kenmerken en interfaces die u in uw projecten kunt gebruiken om EF Core-functies op te lichten zonder dat u afhankelijk bent van EF Core als geheel. Het kenmerk [Eigendom] en de ILazyLoader-interface bevinden zich hier.
Statuswijzigingsevenementen
Nieuwe Tracked
En StateChanged
gebeurtenissen op ChangeTracker
kunnen worden gebruikt om logica te schrijven die reageert op entiteiten die de DbContext invoeren of hun status wijzigen.
Onbewerkte SQL-parameteranalyse
Een nieuwe codeanalyse is opgenomen in EF Core waarmee mogelijk onveilig gebruik van onze raw-SQL-API's wordt gedetecteerd, zoals FromSql
of ExecuteSqlCommand
. Voor de volgende query ziet u bijvoorbeeld een waarschuwing omdat minAge- niet is geparameteriseerd:
var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);
Compatibiliteit van databaseproviders
U wordt aangeraden EF Core 2.1 te gebruiken met providers die zijn bijgewerkt of ten minste zijn getest om te werken met EF Core 2.1.
Fooi
Als u onverwachte incompatibiliteit of een probleem in de nieuwe functies vindt, of als u hier feedback over hebt, kunt u dit melden met behulp van onze probleemtracker.