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 tempatTEntity
AndaDbContext
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
danPost
Blog
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
.