Perubahan Perilaku antara EF6 dan EF Core
Ini adalah daftar perubahan perilaku yang tidak lengkap antara EF6 dan EF Core. Penting untuk diingat karena port Aplikasi Anda mungkin mengubah perilaku aplikasi Anda, tetapi tidak akan muncul sebagai kesalahan kompilasi setelah bertukar ke EF Core.
Ini dimaksudkan sebagai tinjauan tingkat tinggi untuk dipertimbangkan sebagai bagian dari proses porting. Untuk instruksi kasus demi kasus yang lebih rinci, baca kasus terperinci.
Perilaku DbSet.Add/Attach dan grafik
Di EF6, memanggil DbSet.Add()
entitas menghasilkan pencarian rekursif untuk semua entitas yang dirujuk dalam properti navigasinya. Setiap entitas yang ditemukan, dan belum dilacak oleh konteks, juga ditandai sebagai ditambahkan. DbSet.Attach()
bertingkat, kecuali semua entitas ditandai sebagai tidak berubah.
EF Core melakukan pencarian rekursif serupa, tetapi dengan beberapa aturan yang sedikit berbeda.
- Jika entitas akar dikonfigurasi untuk kunci yang dihasilkan dan kunci tidak diatur, entitas akar akan dimasukkan ke dalam status
Added
. - Untuk entitas yang ditemukan selama pencarian rekursif properti navigasi:
- Jika kunci utama entitas disimpan dihasilkan
- Jika kunci primer tidak diatur ke nilai, status diatur ke ditambahkan. Nilai kunci utama dianggap "tidak diatur" jika ditetapkan nilai default CLR untuk jenis properti (misalnya,
0
untukint
,null
untukstring
, dll.). - Jika kunci primer diatur ke nilai, status diatur ke tidak berubah.
- Jika kunci primer tidak diatur ke nilai, status diatur ke ditambahkan. Nilai kunci utama dianggap "tidak diatur" jika ditetapkan nilai default CLR untuk jenis properti (misalnya,
- Jika kunci primer bukan database yang dihasilkan, entitas dimasukkan ke dalam status yang sama dengan akar.
- Jika kunci utama entitas disimpan dihasilkan
- Perubahan perilaku ini hanya berlaku untuk
Attach
grup metode danUpdate
.Add
selalu menempatkan entitas dalamAdded
status, bahkan jika kunci diatur. Attach
metode menempatkan entitas dengan kunci yang diatur keUnchanged
dalam status. Ini memfasilitasi "masukkan jika baru, jika tidak biarkan saja."Update
metode menempatkan entitas dengan kunci yang diatur keModified
dalam status. Ini memfasilitasi "sisipkan jika baru, jika tidak, perbarui."
Filosofi umum di sini adalah bahwa adalah cara yang Update
sangat sederhana untuk menangani sisipan dan pembaruan entitas yang terputus. Ini memastikan entitas baru dimasukkan, dan entitas yang ada diperbarui.
Pada saat yang sama, Add
masih menyediakan cara mudah memaksa entitas untuk dimasukkan. Tambahkan sebagian besar hanya berguna ketika tidak menggunakan kunci yang dihasilkan penyimpanan, sehingga EF tidak tahu apakah entitas baru atau tidak.
Untuk informasi selengkapnya tentang perilaku ini di EF Core, baca Pelacakan Perubahan di EF Core.
Inisialisasi database Code First
EF6 memiliki sejumlah besar sihir yang dilakukannya di sekitar memilih koneksi database dan menginisialisasi database. Beberapa aturan ini meliputi:
- Jika tidak ada konfigurasi yang dilakukan, EF6 akan memilih database di SQL Express atau LocalDb.
- Jika string koneksi dengan nama yang sama dengan konteks dalam file aplikasi
App/Web.config
, koneksi ini akan digunakan. - Jika database tidak ada, database akan dibuat.
- Jika tidak ada tabel dari model yang ada di database, skema untuk model saat ini ditambahkan ke database. Jika migrasi diaktifkan, maka migrasi tersebut digunakan untuk membuat database.
- Jika database ada dan EF6 sebelumnya telah membuat skema, maka skema diperiksa kompatibilitasnya dengan model saat ini. Pengecualian dilemparkan jika model telah berubah sejak skema dibuat.
EF Core tidak melakukan sihir ini.
- Koneksi database harus dikonfigurasi secara eksplisit dalam kode.
- Tidak ada inisialisasi yang dilakukan. Anda harus menggunakan
DbContext.Database.Migrate()
untuk menerapkan migrasi (atauDbContext.Database.EnsureCreated()
dan untukEnsureDeleted()
membuat/menghapus database tanpa menggunakan migrasi).
Konvensi penamaan tabel Code First
EF6 menjalankan nama kelas entitas melalui layanan pluralisasi untuk menghitung nama tabel default tempat entitas dipetakan.
EF Core menggunakan nama DbSet
properti tempat entitas diekspos pada konteks turunan. Jika entitas tidak memiliki DbSet
properti, maka nama kelas digunakan.
Untuk informasi selengkapnya, baca Mengelola Skema Database.