Bagikan melalui


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 untuk int, null untuk string, dll.).
      • Jika kunci primer diatur ke nilai, status diatur ke tidak berubah.
    • Jika kunci primer bukan database yang dihasilkan, entitas dimasukkan ke dalam status yang sama dengan akar.
  • Perubahan perilaku ini hanya berlaku untuk Attach grup metode dan Update . Add selalu menempatkan entitas dalam Added status, bahkan jika kunci diatur.
  • Attach metode menempatkan entitas dengan kunci yang diatur ke Unchanged dalam status. Ini memfasilitasi "masukkan jika baru, jika tidak biarkan saja." Update metode menempatkan entitas dengan kunci yang diatur ke Modified 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 aplikasiApp/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 (atau DbContext.Database.EnsureCreated() dan untuk EnsureDeleted() 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.