Bagikan melalui


Kasus Terperinci untuk Porting dari EF6 ke EF Core

Dokumen ini merinci beberapa perbedaan spesifik antara EF6 dan EF Core. Lihat panduan ini saat memindahkan kode Anda.

Mengonfigurasi koneksi database

Ada beberapa perbedaan antara bagaimana EF6 terhubung ke berbagai sumber data dibandingkan dengan EF Core. Mereka penting untuk dipahami ketika Anda mem-port kode Anda.

  • string Koneksi ion: EF Core tidak secara langsung mendukung beberapa kelebihan konstruktor untuk string koneksi yang berbeda seperti yang dilakukan EF6. Sebaliknya, ia bergantung pada DbContextOptions. Anda masih dapat menyediakan beberapa kelebihan konstruktor dalam jenis turunan, tetapi perlu memetakan koneksi melalui opsi.
  • Konfigurasi dan cache: EF Core mendukung implementasi injeksi dependensi yang lebih kuat dan fleksibel dengan infrastruktur internal yang dapat terhubung ke penyedia layanan eksternal. Ini dapat dikelola oleh aplikasi untuk menangani situasi ketika cache harus dibersihkan. Versi EF6 terbatas dan tidak dapat dibersihkan.
  • File konfigurasi: EF6 mendukung konfigurasi melalui file konfigurasi yang dapat menyertakan penyedia. EF Core memerlukan referensi langsung ke perakitan penyedia dan pendaftaran penyedia eksplisit (yaitu UseSqlServer).
  • pabrik Koneksi ion: Pabrik koneksi yang didukung EF6. EF Core tidak mendukung pabrik koneksi dan selalu memerlukan string koneksi.
  • Pengelogan: secara umum, pengelogan di EF Core jauh lebih kuat dan memiliki beberapa opsi untuk konfigurasi yang disempurnakan.

Konvensi

Konvensi kustom yang didukung EF6 ("ringan") dan konvensi model. Konvensi ringan mirip dengan konfigurasi model pra-konvensi EF Core. Konvensi lain didukung sebagai bagian dari pembangunan model.

EF6 menjalankan konvensi setelah model dibuat. EF Core menerapkannya saat model sedang dibangun. Di EF Core, Anda dapat memisahkan pembuatan model dari sesi aktif dengan DbContext. Dimungkinkan untuk membuat model yang diinisialisasi dengan konvensi.

Validasi data

EF Core tidak mendukung validasi data dan hanya menggunakan anotasi data untuk membangun model dan migrasi. Sebagian besar pustaka klien dari web/MVC ke WinForms dan WPF menyediakan implementasi validasi data untuk digunakan.

Fitur yang akan segera hadir

Ada beberapa fitur di EF6 yang belum ada di EF Core, tetapi ada di peta jalan produk.

  • Jenis tabel per beton (TPC) didukung di EF6 bersama dengan "pemisahan entitas." TPC berada di peta strategi untuk EF7.
  • Pemetaan prosedur tersimpan di EF6 memungkinkan Anda mendelegasikan operasi buat, perbarui, dan hapus ke prosedur tersimpan. EF Core saat ini hanya memungkinkan pemetaan ke prosedur tersimpan untuk pembacaan. Dukungan Buat, perbarui, dan hapus (CUD) ada di peta jalan untuk EF7.
  • Jenis kompleks di EF6 mirip dengan jenis yang dimiliki di EF Core. Namun, serangkaian kemampuan lengkap akan diatasi dengan objek nilai di EF7.

Tinggalkan ObjectContext di belakang

EF Core menggunakan DbContext alih-alih ObjectContext. Anda harus memperbarui kode yang menggunakan IObjectContextAdapter. Ini kadang-kadang digunakan untuk kueri dengan PreserveChanges atau OverwriteChanges opsi gabungkan. Untuk kemampuan serupa di EF Core, lihat metode Muat Ulang .

Konfigurasi model

Ada banyak perbedaan penting antara bagaimana model di EF6 dan EF Core dirancang. EF Core tidak memiliki dukungan penuh untuk pemetaan kondisional. Ini tidak memiliki versi pembuat model.

Perbedaan lainnya meliputi:

Ketik penemuan

Di EF Core, Jenis Entitas ditemukan oleh mesin dengan tiga cara:

  • Mengekspos DbSet<TEntity> di tempat TEntity Anda DbContext adalah jenis yang ingin Anda lacak.
  • Referensi dari Set<TEntity> suatu tempat dalam kode Anda.
  • Jenis kompleks yang direferensikan oleh jenis yang ditemukan ditemukan secara rekursif (misalnya, jika referensi Anda Blog dan PostBlog dapat ditemukan, Post juga akan ditemukan)

Rakitan tidak dipindai untuk jenis turunan.

Pemetaan

.Map() Ekstensi di EF6 telah diganti dengan kelebihan beban dan metode ekstensi di EF Core. Misalnya, Anda dapat menggunakan '. HasDiscriminator()' untuk mengonfigurasi table-per-hierarchy (TPH). Lihat: Pewarisan Pemodelan.

Pemetaan warisan

EF6 didukung table-per-hierarchy (TPH), table-per-type (TPT) dan table-per-concrete-class (TPC) dan mengaktifkan pemetaan hibrid dari berbagai rasa pada tingkat hierarki yang berbeda. EF Core akan terus memerlukan rantai warisan untuk dimodelkan satu arah (TPT atau TPH) dan rencananya adalah menambahkan dukungan untuk TPC di EF7.

Lihat: Pewarisan Pemodelan.

Atribut

EF6 atribut indeks yang didukung pada properti. Di EF Core, mereka diterapkan pada tingkat jenis yang seharusnya memudahkan skenario yang memerlukan indeks komposit. EF Core tidak mendukung kunci komposit dengan anotasi data (yaitu menggunakan Order bersama ColumnAttribute dengan KeyAttribute).

Untuk informasi selengkapnya, lihat: Indeks dan batasan.

Diperlukan dan opsional

Dalam pembuatan model EF Core, IsRequired hanya mengonfigurasi apa yang diperlukan di ujung utama. HasForeignKey sekarang mengonfigurasi akhir utama. Untuk mem-port kode Anda, akan lebih mudah digunakan .Navigation().IsRequired() sebagai gantinya. Contohnya:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

Secara default semuanya bersifat opsional, jadi biasanya tidak perlu memanggil .IsRequired(false).

Dukungan spasial

EF Core terintegrasi dengan pustaka komunitas pustaka pihak ketiga NetTopologySuite untuk memberikan dukungan spasial.

Asosiasi independen

EF Core tidak mendukung asosiasi independen (konsep EDM yang memungkinkan hubungan antara dua entitas didefinisikan independen dari entitas itu sendiri). Konsep serupa yang didukung di EF Core adalah properti bayangan.

Migrasi

EF Core tidak mendukung penginisialisasi database atau migrasi otomatis. Meskipun tidak migrate.exe ada di EF Core, Anda dapat menghasilkan bundel migrasi.

Alat Visual Studio

EF Core tidak memiliki perancang, tidak ada fungsionalitas untuk memperbarui model dari database dan tidak ada alur model-pertama. Tidak ada wizard reverse-engineering dan tidak ada templat bawaan.

Meskipun fitur-fitur ini tidak dikirim dengan EF Core, ada proyek komunitas OSS yang menyediakan alat tambahan. Secara khusus, EF Core Power Tools menyediakan:

  • Rekayasa terbalik dari dalam Visual Studio dengan dukungan untuk proyek database (.dacpac). Menyertakan kustomisasi kode berbasis templat.
  • Inspeksi visual DbContext dengan grafik dan pembuatan skrip model.
  • Manajemen migrasi dari dalam Visual Studio menggunakan GUI.

Untuk daftar lengkap alat dan ekstensi komunitas, lihat: Alat dan Ekstensi Inti EF.

Pelacakan perubahan

Ada beberapa perbedaan antara bagaimana EF6 dan EF Core menangani pelacakan perubahan. Ini dirangkum dalam tabel berikut:

Fitur EF6 EF Core
Status Entitas Menambahkan/melampirkan seluruh grafik Mendukung navigasi ke entitas yang dilepas
Anak yatim Diawetkan Dihapus
Entitas pelacakan mandiri yang terputus Didukung Tidak didukung
Mutasi Dilakukan pada properti Dilakukan pada bidang backing*
Pengikatan data .Local .Local plus .ToObservableCollection atau .ToBindingList
Deteksi perubahan Grafik penuh Per entitas

* Secara default, pemberitahuan properti tidak akan dipicu di EF Core sehingga penting untuk mengonfigurasi entitas pemberitahuan.

Perhatikan bahwa EF Core tidak memanggil deteksi perubahan secara otomatis sesering EF6.

EF Core memperkenalkan detail DebugView untuk pelacak perubahan. Untuk mempelajari lebih lanjut, baca Penelusuran Kesalahan Pelacak Perubahan.

Kueri

EF6 memiliki beberapa kemampuan kueri yang tidak ada di EF Core. Ini termasuk:

  • Beberapa fungsi C# umum dan pemetaan fungsi SQL.
  • Intersepsi pohon perintah untuk kueri dan pembaruan.
  • Dukungan untuk parameter bernilai tabel (TVP).

EF6 memiliki dukungan bawaan untuk proksi pemuatan malas. Ini adalah paket keikutsertaan untuk EF Core (lihat Pemuatan Malas Data Terkait).

EF Core memungkinkan Anda menyusun SQL mentah menggunakan FromSQL.