Chystané novinky v EF Core 2.2 a podpora EF 6.3 pro .NET Core 3.0
Článek se vztahuje k verzi produktu EF Core 2.2
Tento článek byl napsán v roce 2018. Vývojářské technologie se neustále inovují a článek již 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á.