Entity Framework Core 2.2 dirilis. Apa yang baru? (3 dari 3)

Pada tanggal 4 Desember, versi final EF Core 2.2 dirilis. Itu dirilis secara paralel dengan ASP.NET Core 2.2 dan .NET Core 2.2 dan merupakan rilis terbaru dari teknologi open source dan lintas platform kami untuk mengelola pemetaan antara objek bahasa dan database.


EF Core 2.2 RTM berisi lebih dari seratus perbaikan dan beberapa fitur baru, yang akan kita bahas dalam artikel ini.


Tautan mengarah ke artikel yang sesuai di Habré. Ini adalah artikel terakhir ketiga dari seri ini. Lain kali kita akan berbicara tentang rilis baru - dan itu akan di tahun baru.



Data spasial


Data spasial digunakan untuk menyimpan lokasi fisik dan bentuk objek. Banyak basis data yang ada memiliki metode bawaan untuk menyimpan, mengindeks, dan mengambil data tersebut. Skenario penggunaan utama mencari objek pada jarak yang dipilih dan memeriksa bahwa beberapa poligon berisi titik tertentu. EF Core 2.2 sekarang akan dapat bekerja dengan database dan geodata di dalamnya, menggunakan tipe dari perpustakaan NetTopologySuite (NTS).


Data spasial diimplementasikan sebagai set paket ekstensi untuk penyedia khusus. Setiap paket ini menambahkan pemetaan baru untuk tipe dan metode NTS, dan tipe dan fungsi spasial yang sesuai dalam database. Ekstensi penyedia tersebut telah diterapkan untuk SQL Server, SQLite, dan PostgreSQL (berkat proyek Npgsql). Jenis spasial dapat digunakan secara langsung, bersama dengan penyedia di dalam memori EF Core, tanpa menggunakan ekstensi lainnya.


Setelah ekstensi diinstal, dukungan untuk tipe baru disertakan. Properti dengan tipe ini dapat digunakan di entitasnya, misalnya:


using NetTopologySuite.Geometries; namespace MyApp { public class Friend { [Key] public string Name { get; set; } [Required] public Point Location { get; set; } } } 

Tentu saja, sekarang Anda dapat menyimpan data ini:


 using (var context = new MyDbContext()) { context.Add( new Friend { Name = "Bill", Location = new Point(-122.34877, 47.6233355) {SRID = 4326 } }); context.SaveChanges(); } 

Demikian pula, menjadi mungkin untuk membuat pertanyaan ke database yang melibatkan data spasial dan operasi:


  var nearestFriends = (from f in context.Friends orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Data spasial adalah topik besar yang harus Anda mulai dengan dokumentasi resmi .


Koleksi Entitas Tanggungan


EF Core 2.0 memperkenalkan kemampuan untuk memodelkan hubungan satu-ke-satu. EF Core 2.2 memperluas fitur ini dengan kemampuan untuk secara langsung menunjukkan siapa dalam hal ini entitas utama (pemilik), dan siapa yang bergantung (dimiliki). Ini memungkinkan Anda untuk membatasi dan memperjelas ruang lingkup entitas.


Misalnya, entitas dependen:


  • Mereka hanya dapat digunakan dalam properti referensi ( “properti navigasi” dalam bahasa Inggris ) yang terkandung dalam jenis entitas lainnya;
  • Secara otomatis dimuat dan dilacak dalam DbContext hanya bersama dengan entitas utamanya.

Dalam database relasional, koleksi dependen tidak ditampilkan dalam tabel entitas utama, tetapi dalam tabel terpisah, mirip dengan hubungan satu-ke-banyak yang biasa. Dalam database berorientasi dokumen, semuanya agak berbeda, dan kami berencana untuk menanamkan entitas dependen (dalam koleksi dependen atau tautan) dalam dokumen yang sama di mana entitas utama disimpan.


Anda dapat menggunakan fitur ini dengan memanggil API OwnsMany() :


 modelBuilder.Entity<Customer>().OwnsMany(c => c.Addresses); 

Untuk informasi lebih lanjut, lihat dokumentasi .


Tag kueri


Fitur ini dimaksudkan untuk menyederhanakan tugas menemukan koneksi antara permintaan LINQ dalam kode dan permintaan SQL yang dihasilkan dari mereka, yang dapat ditemukan dalam log.


Untuk mengaktifkan tag, beri anotasi kueri LINQ menggunakan metode TagWith() . Mari kita sedikit memodifikasi contoh sebelumnya dari bagian data spasial:


  var nearestFriends = (from f in context.Friends.TagWith(@"This is my spatial query!") orderby f.Location.Distance(myLocation) descending select f).Take(5).ToList(); 

Anda dapat melihat teks berikut di log:


 -- This is my spatial query! SELECT TOP(@__p_1) [f].[Name], [f].[Location] FROM [Friends] AS [f] ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC 

Seperti biasa, ada [bagian dalam dokumentasi] tentang ini.


Kompatibel dengan EF Core 2.1


Kami menghabiskan banyak waktu dan upaya untuk memastikan kompatibilitas mundur dari EF Core 2.2 dengan penyedia EF Core 2.1 yang ada dan membuatnya sehingga setelah memperbarui ke EF Core 2.2 aplikasi dikumpulkan tanpa masalah yang terlihat. Kemungkinan besar, dalam kebanyakan kasus, migrasi ke versi baru akan sederhana, namun demikian, jika Anda tiba-tiba menghadapi masalah, ada baiknya membicarakannya di bugtracker kami .


Saat ini, hanya ada satu perubahan yang mungkin memerlukan perubahan kecil pada kode aplikasi. Anda dapat membacanya di deskripsi tiket berikut:


  • # 13986 : Suatu tipe yang dikonfigurasikan sebagai properti reguler dan sebagai properti dependen, membutuhkan pembuatan kunci utama segera setelah peningkatan dari 2.1 ke 2.2.

Kami bermaksud untuk terus memelihara dan memperbarui daftar masalah yang memerlukan modifikasi kode lama.


Apa selanjutnya: EF Core 3.0


Setelah merilis versi 2.2, tujuan kami berikutnya adalah EF Core 3.0. Kami belum menerapkan fitur baru, sehingga paket NuGet yang dirilis pada 4 Desember hanya berisi beberapa perubahan kecil yang dibuat setelah rilis EF Core 2.2.


Sudah ada beberapa ide besar yang dibahas secara luas yang direncanakan untuk rilis berikutnya. Kami ingin membicarakannya di rilis berita mendatang, tetapi di sini ada beberapa topik yang sudah dapat Anda katakan:


  • Perbaikan dalam LINQ . LINQ memungkinkan Anda untuk menulis kueri basis data tanpa harus beralih dari bahasa utama Anda ke bahasa basis data, menggunakan informasi jenis untuk menampilkan IntelliSense dan memvalidasi pada waktu kompilasi. Tetapi ini juga berarti bahwa LINQ memungkinkan Anda untuk menulis jumlah pertanyaan kompleks yang tidak terbatas, yang selalu menjadi tantangan nyata bagi penyedia LINQ. Dalam versi pertama EF Core, kami memecahkan masalah ini dengan menentukan bagian mana dari permintaan yang dapat diterjemahkan ke dalam SQL, dan kemudian memungkinkan sisa permintaan dieksekusi langsung pada klien, menggunakan memori klien ini. Eksekusi sisi klien ini kadang-kadang bisa bermanfaat, tetapi dalam banyak kasus mengarah ke permintaan yang sangat tidak efisien yang tidak dapat ditemukan sampai kode masuk ke produksi. EF Core 3.0 ingin melakukan pekerjaan menyeluruh untuk mengubah internal LINQ dan cara mengujinya. Hal ini diperlukan untuk membuatnya lebih tahan lama dan dapat diandalkan (misalnya, agar permintaan tidak rusak setelah meluncurkan rilis patch baru); mengimplementasikan terjemahan yang benar dalam SQL dari sejumlah besar ekspresi; fokus pada menghasilkan kueri yang akan bekerja lebih efisien dalam lebih banyak kasus; untuk mempertimbangkan bahwa permintaan yang tidak efisien tidak luput dari perhatian.


  • Dukungan Cosmos DB . Kami terus bekerja pada penyedia DB Cosmos untuk EF Core sehingga pengembang yang akrab dengan model pemrograman EF dapat segera menargetkan Azure Cosmos DB sebagai basis utama mereka. Tantangannya adalah memanfaatkan yang terbaik di Cosmos DB, seperti distribusi global, ketersediaan "selalu ada", skalabilitas elastis, latensi rendah, dan sebagainya. Penyedia EF Core harus menyediakan sebagian besar fitur yang tersedia. Kami mulai melakukan ini jauh sebelum EF Core 2.2 dan bahkan merilis beberapa versi awal . Kami akan terus mengembangkan penyedia secara paralel dengan EF Core 3.0.


  • Dukungan untuk C # 8.0 . C # 8.0 memiliki beberapa fitur baru yang bermanfaat seperti aliran async (termasuk await foreach ) dan jenis referensi yang dapat dibatalkan yang didukung oleh EF Core.


  • Membalik database menjadi tipe kueri . EF Core 2.1 menambahkan dukungan untuk jenis kueri yang mewakili data yang dapat dibaca dari basis data tetapi tidak dapat diperbarui. Mereka sangat bagus untuk memodelkan tampilan dalam database SQL, dan EF Core 3.0 ingin mengotomatiskan kreasi mereka.


  • Entitas Tas Properti . Ini menambahkan entitas yang menyimpan data tidak dalam properti biasa, tetapi dalam yang diindeks, dan dapat menggunakan instance dari kelas yang sama di .NET (misalnya, sesuatu seperti Dictionary<string, object> ) untuk menampilkan berbagai jenis entitas dalam satu dan model EF Core yang sama. Fitur ini adalah langkah selanjutnya dalam perjalanan menuju hubungan banyak-ke-banyak tanpa menggunakan entitas yang menyatukan - yaitu, salah satu fitur yang paling diantisipasi dari EF Core.


  • EF 6.3 pada .NET Core . Jelas bahwa sekarang ada banyak aplikasi yang menggunakan EF, dan memindahkannya ke EF Core hanya untuk mendapatkan beberapa manfaat dari penggunaan .NET Core terkadang membutuhkan banyak usaha. Oleh karena itu, kami akan mengadaptasi versi EF 6 berikutnya sehingga juga mulai bekerja pada .NET Core 3.0. Ini untuk mendorong pengembang untuk port aplikasi mereka sehingga mereka harus mengubah kode sesedikit mungkin. Tentu saja, ini akan menyebabkan sejumlah keterbatasan (misalnya, penyedia baru akan diperlukan dan dukungan data spasial tidak akan diaktifkan untuk SQL Server). Selain itu, kami tidak berencana untuk menambahkan fitur tambahan apa pun ke EF 6.



Kesimpulan


Tim EF berterima kasih kepada komunitas atas umpan balik kualitas dan bantuan pengembangan yang pada akhirnya mengarah pada pengenalan EF Core 2.2. Seperti biasa, kami mengingatkan Anda bahwa ishshui baru dapat ditambahkan langsung ke pelacak kami . Terima kasih


Jangan lupa bahwa tiket untuk DotNext mulai 1 Januari akan naik harga. Pribadi - untuk seribu, dan Standar - untuk dua ribu. Rincian tentang Early Bird ada di situs .

Source: https://habr.com/ru/post/id433442/


All Articles