Kerangka Kerja Entitas - Siklus Hidup
Seumur hidup
Masa pakai konteks dimulai saat instance dibuat dan berakhir saat instance dibuang atau dikumpulkan sampahnya.
Konteks seumur hidup adalah keputusan yang sangat penting untuk dibuat saat kita menggunakan ORM.
Konteksnya bekerja seperti cache entitas, jadi itu berarti ia menyimpan referensi ke semua entitas yang dimuat yang mungkin tumbuh sangat cepat dalam konsumsi memori dan juga dapat menyebabkan kebocoran memori.
Pada diagram di bawah ini, Anda dapat melihat alur kerja data tingkat atas dari aplikasi ke database melalui Konteks dan sebaliknya.
Siklus Hidup Entitas
Siklus Hidup Entitas menjelaskan proses di mana Entitas dibuat, ditambahkan, dimodifikasi, dihapus, dll. Entitas memiliki banyak status selama masa pakainya. Sebelum melihat cara mengambil status entitas, mari kita lihat apa itu status entitas. Negara bagian adalah enum tipeSystem.Data.EntityState yang menyatakan nilai-nilai berikut -
Added: Entitas tersebut ditandai sebagai ditambahkan.
Deleted: Entitas tersebut ditandai sebagai dihapus.
Modified: Entitas telah diubah.
Unchanged: Entitas belum diubah.
Detached: Entitas tidak dilacak.
Status Perubahan dalam Siklus Hidup Entitas
Terkadang status entitas diatur secara otomatis oleh konteksnya, tetapi juga dapat diubah secara manual oleh pengembang. Meskipun semua kombinasi sakelar dari satu kondisi ke kondisi lain dimungkinkan, tetapi beberapa di antaranya tidak ada artinya. Sebagai contoh,Added entitas ke Deleted negara bagian, atau sebaliknya.
Mari kita bahas tentang berbagai negara bagian.
Status Tidak Berubah
Ketika sebuah entitas tidak berubah, itu terikat ke konteks tetapi belum dimodifikasi.
Secara default, entitas yang diambil dari database berada dalam status ini.
Ketika entitas dilampirkan ke konteks (dengan metode Lampirkan), itu juga dalam keadaan Tidak Berubah.
Konteks tidak dapat melacak perubahan pada objek yang tidak direferensikan, jadi ketika dilampirkan, diasumsikan tidak berubah.
Status Terpisah
Terpisah adalah status default dari entitas yang baru dibuat karena konteksnya tidak dapat melacak pembuatan objek apa pun di kode Anda.
Ini benar bahkan jika Anda membuat instance entitas di dalam blok penggunaan konteks.
Terpisah bahkan status entitas yang diambil dari database saat pelacakan dinonaktifkan.
Ketika sebuah entitas terlepas, itu tidak terikat pada konteks, jadi statusnya tidak dilacak.
Ini dapat dibuang, dimodifikasi, digunakan dalam kombinasi dengan kelas lain, atau digunakan dengan cara lain yang mungkin Anda perlukan.
Karena tidak ada pelacakan konteks, itu tidak ada artinya bagi Kerangka Kerja Entitas.
Status Ditambahkan
Saat entitas berada dalam status Ditambahkan, Anda memiliki beberapa opsi. Nyatanya, Anda hanya bisa melepaskannya dari konteksnya.
Biasanya, meskipun Anda memodifikasi beberapa properti, statusnya tetap Ditambahkan, karena memindahkannya ke Dimodifikasi, Tidak Berubah, atau Dihapus tidak masuk akal.
Ini adalah entitas baru dan tidak memiliki korespondensi dengan baris di database.
Ini adalah prasyarat mendasar untuk berada di salah satu negara bagian tersebut (tetapi aturan ini tidak ditegakkan oleh konteksnya).
Status yang Dimodifikasi
Ketika sebuah entitas diubah, itu berarti itu dalam keadaan Tidak Berubah dan kemudian beberapa properti diubah.
Setelah entitas memasuki status Modifikasi, entitas dapat berpindah ke status Terpisah atau Dihapus, tetapi tidak dapat memutar kembali ke status Tidak Berubah meskipun Anda memulihkan nilai aslinya secara manual.
Itu bahkan tidak dapat diubah menjadi Ditambahkan, kecuali Anda melepaskan dan menambahkan entitas ke konteks, karena baris dengan ID ini sudah ada di database, dan Anda akan mendapatkan pengecualian waktu proses saat mempertahankannya.
Status Dihapus
Entitas memasuki status Dihapus karena tidak Berubah atau Dimodifikasi dan kemudian metode DeleteObject digunakan.
Ini adalah status paling ketat, karena tidak ada gunanya mengubah dari status ini ke nilai lain selain Terpisah.
Itu usingpernyataan jika Anda ingin semua sumber daya yang kontrol konteks akan dibuang di akhir blok. Saat Anda menggunakanusing pernyataan, kemudian kompilator secara otomatis membuat blok coba / akhirnya dan panggilan dibuang di blok akhirnya.
using (var context = new UniContext()) {
var student = new Student {
LastName = "Khan",
FirstMidName = "Ali",
EnrollmentDate = DateTime.Parse("2005-09-01")
};
context.Students.Add(student);
context.SaveChanges();
}
Saat bekerja dengan konteks jangka panjang pertimbangkan hal berikut -
Saat Anda memuat lebih banyak objek dan referensinya ke dalam memori, konsumsi memori dari konteks dapat meningkat dengan cepat. Ini dapat menyebabkan masalah kinerja.
Ingatlah untuk membuang konteks saat tidak lagi diperlukan.
Jika pengecualian menyebabkan konteks berada dalam keadaan tidak dapat dipulihkan, seluruh aplikasi dapat dihentikan.
Peluang untuk mengalami masalah terkait konkurensi meningkat seiring dengan meningkatnya jarak antara waktu ketika data dikueri dan diperbarui.
Saat bekerja dengan aplikasi Web, gunakan contoh konteks per permintaan.
Saat bekerja dengan Windows Presentation Foundation (WPF) atau Formulir Windows, gunakan contoh konteks per formulir. Ini memungkinkan Anda menggunakan fungsionalitas pelacakan perubahan yang disediakan konteks.
Aturan Thumb
Web Applications
Sekarang menjadi praktik umum dan terbaik bahwa untuk aplikasi web, konteks digunakan per permintaan.
Dalam aplikasi web, kami menangani permintaan yang sangat singkat tetapi menampung semua transaksi server, oleh karena itu, mereka memiliki durasi yang tepat untuk konteks tempat tinggal.
Desktop Applications
Untuk aplikasi desktop, seperti Win Forms / WPF, dll. Konteksnya digunakan per formulir / dialog / halaman.
Karena kami tidak ingin memiliki konteks sebagai tunggal untuk aplikasi kami, kami akan membuangnya saat kami berpindah dari satu bentuk ke bentuk lainnya.
Dengan cara ini, kita akan mendapatkan banyak kemampuan konteks dan tidak akan menderita karena implikasi dari konteks jangka panjang.