Memindahkan dari EF6 ke EF Core

Singkatnya, Entity Framework Core, atau EF Core, adalah penulisan ulang total Kerangka Kerja Entitas untuk arsitektur aplikasi modern. Karena perubahan mendasar, tidak ada jalur peningkatan langsung. Tujuan dari dokumentasi ini adalah untuk memberikan panduan end-to-end untuk memindahkan aplikasi EF6 Anda ke EF Core.

Penting

Sebelum Anda memulai proses porting, penting untuk memvalidasi bahwa EF Core memenuhi persyaratan akses data untuk aplikasi Anda. Anda dapat menemukan semua yang Anda butuhkan dalam dokumentasi EF Core.

Peringatan

EF Core hanya mendukung .NET modern, dan tidak mendukung .NET Framework. Dengan demikian, jika proyek Anda masih menargetkan .NET Framework, Anda harus bermigrasi ke .NET modern sebelum Anda dapat memulai migrasi dari EF6 ke EF Core. Perhatikan bahwa EF6 mendukung .NET modern, sehingga Anda dapat bermigrasi ke .NET modern terlebih dahulu sambil menjaga EF6, lalu mengatasi migrasi dari EF6 ke EF Core.

Alasan untuk meningkatkan

Semua pengembangan Entity Framework baru terjadi di EF Core. Tidak ada rencana untuk mendukung fitur baru apa pun ke EF6. EF Core berjalan pada runtime .NET terbaru dan memanfaatkan sepenuhnya runtime, khusus platform (seperti ASP.NET Core atau WPF) dan fitur khusus bahasa. Berikut adalah beberapa manfaat yang Anda peroleh dari peningkatan:

  • Manfaatkan peningkatan performa yang sedang berlangsung di EF Core. Misalnya, satu orang pelanggan yang bermigrasi dari EF6 ke EF Core 6 mengalami pengurangan penggunaan kueri yang berat sebanyak 40 kali karena fitur pemisahan kueri. Banyak pelanggan melaporkan perolehan performa yang sangat besar hanya dengan pindah ke EF Core terbaru.
  • Gunakan fitur baru di EF Core. Tidak akan ada fitur baru yang ditambahkan ke EF6. Semua fungsionalitas baru, misalnya penyedia Azure Cosmos DB dan DbContextFactory, hanya akan ditambahkan ke EF Core. Untuk perbandingan lengkap EF6 dengan EF Core, termasuk beberapa fitur yang eksklusif untuk EF Core, lihat: Membandingkan EF Core & EF6.
  • Modernisasi tumpukan aplikasi Anda dengan menggunakan injeksi dependensi dan integrasikan akses data Anda dengan mulus dengan teknologi seperti gRPC dan GraphQL.

Catatan tentang migrasi

Dokumentasi ini menggunakan istilah port dan pembaruan agar tidak membingungkan dengan istilah migrasi sebagai fitur EF Core. Migrasi di EF Core tidak kompatibel dengan migrasi EF6 Code First karena peningkatan signifikan pada cara migrasi ditangani. Tidak ada pendekatan yang direkomendasikan untuk memindahkan riwayat migrasi Anda, jadi rencanakan untuk memulai "segar" di EF Core. Anda dapat mempertahankan basis kode dan data dari migrasi EF6 Anda. Terapkan migrasi akhir Anda di EF6, lalu buat migrasi awal di EF Core. Anda akan dapat melacak riwayat di EF Core ke depan.

Langkah-langkah peningkatan

Jalur peningkatan telah dibagi menjadi beberapa dokumen yang diatur oleh fase peningkatan Dan jenis aplikasi Anda.

Tentukan "rasa" EF Core Anda

Ada beberapa pendekatan tentang cara kerja EF Core dengan model domain dan implementasi database Anda. Secara umum, sebagian besar aplikasi akan mengikuti salah satu pola ini dan bagaimana Anda mendekati port Anda akan bergantung pada "rasa" aplikasi.

Kode sebagai sumber kebenaran adalah pendekatan di mana semuanya dimodelkan melalui kode dan kelas, baik melalui atribut data, konfigurasi fasih, atau kombinasi keduanya. Database awalnya dihasilkan berdasarkan model yang ditentukan dalam EF Core dan pembaruan lebih lanjut biasanya ditangani melalui migrasi. Ini sering disebut sebagai "code first", tetapi namanya tidak sepenuhnya akurat karena salah satu pendekatannya adalah memulai dengan database yang ada, menghasilkan entitas Anda, dan kemudian memelihara dengan kode di tahap selanjutnya.

Database sebagai sumber kebenaran melibatkan rekayasa ulang atau scaffolding kode Anda dari database. Ketika perubahan skema dilakukan, kode diregenerasi atau diperbarui untuk mencerminkan perubahan. Ini sering disebut "pendekatan database terlebih dahulu."

Akhirnya, pendekatan pemetaan Hibrid yang lebih canggih mengikuti filosofi bahwa kode dan database dikelola secara terpisah, dan EF Core digunakan untuk memetakan di antara keduanya. Pendekatan ini biasanya menghindari migrasi.

Tabel berikut ini meringkas beberapa perbedaan tingkat tinggi:

Pendekatan Peran pengembang Peran DBA Migrasi Perancah Repo
Kode terlebih dahulu Mendesain entitas dan memverifikasi/menyesuaikan migrasi yang dihasilkan Memverifikasi definisi dan perubahan skema Izinkan penerapan Tidak tersedia Melacak entitas, DbContext, dan migrasi
Fokus pada database terlebih dahulu Lakukan reverse engineering setelah perubahan dan verifikasi entitas yang dihasilkan. Beri tahu pengembang saat ada perubahan database yang memerlukan regenerasi struktur. Tidak tersedia Untuk setiap perubahan skema Melacak ekstensi/kelas parsial yang memperluas entitas yang dihasilkan
Hibrida Memperbarui konfigurasi fasih untuk memetakan setiap kali entitas atau database berubah Memberi tahu pengembang ketika database telah berubah sehingga mereka dapat memperbarui entitas dan konfigurasi model Tidak tersedia Tidak tersedia Melacak entitas dan DbContext

Pendekatan hibrid adalah pendekatan yang lebih canggih dengan overhead tambahan dibandingkan dengan pendekatan kode dan database tradisional.

Memahami dampak menjauh dari EDMX

EF6 mendukung format definisi model khusus bernama ENTITY Data Model XML (EDMX). File EDMX berisi beberapa definisi, termasuk definisi skema konseptual (CSDL), spesifikasi pemetaan (MSL), dan definisi skema penyimpanan (SSDL). EF Core melacak skema domain, pemetaan, dan database melalui grafik model internal dan tidak mendukung format EDMX. Banyak posting blog dan artikel yang salah menyatakan ini berarti EF Core hanya mendukung "kode terlebih dahulu." EF Core mendukung ketiga model aplikasi yang dijelaskan di bagian sebelumnya. Anda dapat membangun kembali model di EF Core dengan merekayasa balik database. Jika Anda menggunakan EDMX untuk representasi visual model entitas Anda, pertimbangkan untuk menggunakan EF Core Power Tools sumber terbuka yang menyediakan kemampuan serupa untuk EF Core.

Untuk informasi selengkapnya tentang dampak kurangnya dukungan untuk file EDMX, baca panduan porting EDMX .

Lakukan langkah-langkah peningkatan

Ini bukan persyaratan untuk memindahkan seluruh aplikasi. EF6 dan EF Core dapat berjalan dalam aplikasi yang sama (lihat: menggunakan EF Core dan EF6 dalam aplikasi yang sama). Untuk meminimalkan risiko, Anda dapat mempertimbangkan:

  1. Pindah ke EF6 di .NET Core jika Anda belum melakukannya.
  2. Migrasikan sebagian kecil aplikasi Anda ke EF Core dan jalankan secara berdampingan dengan EF6.
  3. Akhirnya, bawa basis kode lainnya ke EF Core dan hentikan kode EF6.

Mengenai port itu sendiri, secara garis besar, Anda akan:

  1. Tinjau perubahan perilaku antara EF6 dan EF Core.
  2. Lakukan migrasi akhir Anda, jika ada, di EF6.
  3. Buat proyek EF Core Anda.
  4. Salin kode ke proyek baru, jalankan reverse-engineering, atau kombinasi keduanya.
  5. Ganti nama referensi dan entitas serta memperbarui perilaku.
    • System.Data.Entity ke Microsoft.EntityFrameworkCore
    • Ubah DbContext konstruktor untuk menggunakan opsi dan/atau mengganti OnConfiguring
    • DbModelBuilder ke ModelBuilder
    • Ganti nama DbEntityEntry<T> menjadi EntityEntry<T>
    • Berpindah dari Database.Log ke Microsoft.Extensions.Logging API (tingkat lanjut) atau DbContextOptionsBuilder.LogTo (sederhana)
    • Terapkan perubahan untuk WithRequired dan WithOptional (lihat di sini)
    • Perbarui kode validasi. Tidak ada validasi data yang disertakan dalam EF Core, tetapi Anda dapat melakukannya sendiri.
    • Ikuti langkah-langkah yang diperlukan untuk memigrasi dari EDMX.
  6. Lakukan langkah-langkah khusus berdasarkan pendekatan EF Core Anda:

Ada banyak pertimbangan yang berkaitan dengan semua pendekatan, jadi Anda juga ingin meninjau cara untuk menangani dan menyelesaikan perbedaan terperinci antara EF6 dan EF Core.