Konzultant a lektor pro [ASP].NET Core & REST API

Chystané novinky v EF Core 2.2 a podpora EF 6.3 pro .NET Core 3.0

Miroslav Holec

Miroslav Holec

8. října. 2018

Poslední minor verze EF Core, kterou nyní používáme pod označením EF Core 2.1 přinesla velké množství novinek. V dalším releasu (aktuálně v preview-2) nás čeká výrazně méně novinek, které však mohou velmi potěšit vývojáře používající Cosmos DB.

Owned Entity Types jako kolekce

Z Entity Framework 6 možná znáte komplexní typy, které byly přeneseny do EF Core 2.0 pod označením Owned Entity Types. Díky této funkci je možné sdružit společné vlastnosti do jedné C# třídy a tu referencovat jako property.

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
}

// OnModelCreating
modelBuilder.Entity<Order>().OwnsOne(p => p.BillingAddress);
modelBuilder.Entity<Order>().OwnsOne(p => p.ShippingAddress);

Výhoda je celkem zřejmá. Nemusíme opakovat dokola stejné properties - máme je sdružené v jedné třídě. Pokud by komplexním typem byla například třída Price, pak by konečná třída mohla navíc umět unifikovaně dopočítat například cenu s DPH nebo DPH na základě sazby. Výsledek se vždy namapuje do jedné tabulky:

Order
---------
Id
BillingAddress_Street
BillingAddress_City
ShippingAddress_Street
ShippingAddress_City

Od verze EF Core 2.2 bude možné používat tyto typy ve formě kolekcí:

public class Order
{
    public int Id { get; set; }
    public List<Address> Addresses { get; set; }
}

modelBuilder.Entity<Order>().OwnsMany(p => p.Addresses);

Komplexní typ Address bude vyžadovat vlastní PK (by default property Id). Konečný rozdíl bude v tom, že se tyto kolekce budou automaticky mapovat na samostatnou tabulku v databázi (Addresses) a zároveň nebude potřeba k dotažení dat používat Include. Tuto funkcionalitu ve verzi preview-2 lze vyzkoušet, avšak vykazuje ještě mnoho chyb. Doporučuji tedy vyčkat na preview-3.

Spatial Types

Další novinkou, kterou známe i z EF 6 budou Spatial Types a jejich podporu zajistíme novým NuGet balíčkem Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite a dodatečnou konfigurací SQL Providera:

// Startup.cs - ConfigureServices
services.AddDbContext<AppDbContext>(op => op.UseSqlServer(connectionstring, opt => opt.UseNetTopologySuite()));

Díky tomu se nám pro SQL Server zpřístupní některé další datové typy (geometrie, geolokace), které známe z EF 6 jako DbGeography - SqlGeography aj. Níže je ukázka s geometrickým typem Point.

public class Measurement
{
   public int Id {get; set;}
   public DateTime Date {get; set;}
   public Point Location {get; set;}
}

Cosmos DB Provider

V minulosti jsme viděli CosmosDB Provider ve formě PoC v některých demech. Nyní se plánuje uvolnění veřejné verze, která je již nyní k otestování v rámci preview-2. Použití bude velmi podobné jako v případě SQL Serveru, pouze se místo extension UseSqlServer použije UseCosmosSql a předají se argumenty jako account + key.

I v tomto případě budeme mít k dispozici celý arsenál funkcí, které známe z EF Core 2.1, pouze data se budou ukládat ve strukturované formě (JSON) do Cosmos DB. Kromě vlastních properties tříd budou záznamy doplněny o dodatečné property pro práci Cosmos DB (např.: _rid, _self, _etag, _ts, _attachments).

Pro správu Cosmos DB je už nyní dostupný Azure Cosmos DB Emulator (přímé stažení - MSI file).

EF 6.3 na .NET Core 3.0

Pro vývojáře, kteří nechtějí migrovat EF 6 na EF Core avšak chtějí používat výhody .NET Core bude s příchodem .NET Core 3.0 (někdy v roce 2019) existovat nové řešení. Microsoft uvolní novou verzi Entity Framework 6.3, kterou bude možné referencovat v .NET Core 3.0 projektech. Balíček bude plně multiplatformní a kromě plné kompatibility zřejmě nepřinese žádné nové funkce, které známe nově z EF Core.

Obecně klasický Entity Framework není v plánu nijak rozšiřovat (jestli vůbec) a doporučené je vždy upřednostňovat EF Core. Přesto cílem Microsoftu bylo přinést podporu vývojářským týmům, pro které by byla migrace EF na EF Core problematická.


Zeptejte se