- Penyambungan koneksi ditangani seperti pada aplikasi ADO.NET lainnya. Koneksi entitas masih menggunakan koneksi database tradisional dengan string koneksi tradisional. Saya percaya Anda dapat mematikan koneksi koneksi dalam string koneksi jika Anda tidak ingin menggunakannya. (baca lebih lanjut tentang SQL Server Connection Pooling (ADO.NET) )
- Jangan pernah menggunakan konteks global. ObjectContext secara internal mengimplementasikan beberapa pola termasuk Identity Map dan Unit of Work. Dampak penggunaan konteks global berbeda untuk setiap jenis aplikasi.
- Untuk aplikasi web gunakan konteks tunggal per permintaan. Untuk layanan web, gunakan satu konteks per panggilan. Dalam aplikasi WinForms atau WPF gunakan konteks tunggal per formulir atau per presenter. Mungkin ada beberapa persyaratan khusus yang tidak memungkinkan untuk menggunakan pendekatan ini tetapi dalam kebanyakan situasi ini sudah cukup.
Jika Anda ingin tahu dampak apa yang memiliki konteks objek tunggal untuk aplikasi WPF / WinForm, periksa artikel ini . Ini tentang Sesi NHibernate tetapi idenya sama.
Edit:
Saat Anda menggunakan EF, secara default memuat setiap entitas hanya satu kali per konteks. Kueri pertama membuat instace entitas dan menyimpannya secara internal. Kueri selanjutnya yang memerlukan entitas dengan kunci yang sama mengembalikan instance yang disimpan ini. Jika nilai dalam penyimpanan data berubah, Anda masih menerima entitas dengan nilai dari kueri awal. Ini disebut pola peta Identitas . Anda bisa memaksa konteks objek untuk memuat ulang entitas tetapi akan memuat ulang satu contoh bersama.
Setiap perubahan yang dilakukan pada entitas tidak bertahan sampai Anda memanggil SaveChanges
konteksnya. Anda dapat melakukan perubahan di banyak entitas dan menyimpannya sekaligus. Ini disebut pola Unit Kerja . Anda tidak dapat secara selektif mengatakan entitas terlampir yang dimodifikasi yang ingin Anda simpan.
Kombinasikan dua pola ini dan Anda akan melihat beberapa efek menarik. Anda hanya memiliki satu instance entitas untuk seluruh aplikasi. Setiap perubahan pada entitas memengaruhi seluruh aplikasi meskipun perubahan belum dilakukan (berkomitmen). Dalam kebanyakan kali ini bukan yang Anda inginkan. Misalkan Anda memiliki formulir edit dalam aplikasi WPF. Anda bekerja dengan entitas dan Anda memutuskan untuk membatalkan editasi kompleks (mengubah nilai, menambahkan entitas terkait, menghapus entitas terkait lainnya, dll.). Tetapi entitas sudah dimodifikasi dalam konteks bersama. Apa yang akan kamu lakukan? Petunjuk: Saya tidak tahu tentang CancelChanges atau UndoChanges aktif ObjectContext
.
Saya pikir kita tidak perlu membahas skenario server. Cukup berbagi satu entitas di antara beberapa permintaan HTTP atau panggilan layanan Web membuat aplikasi Anda tidak berguna. Setiap permintaan dapat memicu SaveChanges
dan menyimpan sebagian data dari permintaan lain karena Anda berbagi satu unit kerja di antara semuanya. Ini juga akan memiliki masalah lain - konteks dan manipulasi dengan entitas dalam konteks atau koneksi database yang digunakan oleh konteks tidak aman thread.
Bahkan untuk aplikasi yang hanya bisa dibaca, konteks global bukanlah pilihan yang baik karena Anda mungkin menginginkan data baru setiap kali Anda meminta aplikasi.
TransactionScope
bukan milik unit kerja, itu milik logika bisnis Anda karena logika itu sendiri mendefinisikan transaksi. Unit kerja hanya menentukan apa yang harus bertahan bersama sedangkan ruang lingkup transaksi memungkinkan Anda menggunakan unit kerja yang gigih beberapa kali dalam transaksi yang sama.Menurut Daniel Simmons:
Ini dari artikel komprehensifnya di sini:
http://msdn.microsoft.com/en-us/magazine/ee335715.aspx
Saya percaya saran ini meluas ke permintaan HTTP, jadi akan berlaku untuk ASP.NET. Aplikasi stateful, klien-gemuk seperti aplikasi WPF mungkin satu-satunya kasus untuk konteks "bersama".
sumber
IDisposable
, oleh karena itu harus terbuka untuk waktu yang masuk akal terpendek, adalah pandangan saya.Dokumentasi Accoriding ke EF6 (4,5 juga): https://msdn.microsoft.com/en-us/data/hh949853#9
9.3 Konteks per permintaan
Konteks Entity Framework dimaksudkan untuk digunakan sebagai instance yang berumur pendek untuk memberikan pengalaman kinerja yang paling optimal . Konteks diharapkan berumur pendek dan dibuang, dan dengan demikian telah diterapkan untuk menjadi sangat ringan dan menggunakan kembali metadata bila memungkinkan. Dalam skenario web, penting untuk mengingat hal ini dan tidak memiliki konteks lebih dari durasi permintaan tunggal. Demikian pula, dalam skenario non-web, konteks harus dibuang berdasarkan pemahaman Anda tentang berbagai level caching di Entity Framework. Secara umum, seseorang harus menghindari memiliki instance konteks sepanjang umur aplikasi, serta konteks per thread dan konteks statis.
sumber
Kode di bawah ini membantu objek saya untuk di-refresh dengan nilai basis data yang segar. Perintah Entry (objek) .Reload () memaksa objek untuk memanggil kembali nilai basis data
sumber
CType(myContext, IObjectContextAdapter).ObjectContext.Refresh(RefreshMode.StoreWins,myCustomers)