Miroslav Holec
Premium

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

Miroslav Holec   8. října 2018

Článek se vztahuje k verzi produktu EF Core 2.2

Tento článek je již velmi zastaralý. Článek nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.

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á.