Menggunakan EF untuk memanipulasi database, mengekstrak DbContext (kelas konteks operasi database) dalam permintaan HTTP yang sama untuk memastikan keunikan, artikel menggunakan dua skema untuk memastikan keunikan konteks Entity Framework, dan solusi pada platform .NET Core dilampirkan.
Opsi 1
Jika suatu objek dijamin unik secara global, Anda pasti akan memikirkan pola desain klasik: mode singleton, jika objek yang akan digunakan harus unik di utas?
Slot data: CallContext, ok lihat penjelasan msdn tentang callcontent.
CallContext adalah objek koleksi khusus yang mirip dengan penyimpanan lokal utas untuk panggilan metode, dan menyediakan slot data yang unik untuk setiap utas eksekusi logis. Slot data tidak dibagikan antar konteks panggilan pada utas logis lainnya. Objek dapat ditambahkan ke CallContext saat menyebar bolak-balik di sepanjang jalur kode eksekusi dan diperiksa oleh objek individual di jalur tersebut.
Artinya, utas saat ini menyimpan objek ke penyimpanan lokal utas, dan objek dihancurkan saat utas dihancurkan.
Gunakan kode:
Skenario penggunaan: Saya pribadi berpikir itu digunakan ketika objek perlu digunakan secara global dalam utas, dan utas ekstensi paket utas lainnya tidak dapat mengaksesnya. Misalnya, dalam konteks data EF, utas akan dibuat untuk setiap permintaan, dan pada saat ini, objek konteks data akan dibuat untuk fungsi yang berbeda untuk digunakan, dan akhirnya melakukan commit bersama untuk menghindari masalah transaksi. Tentu saja, beberapa orang mungkin bertanya kepada saya apakah saya dapat membuat variabel untuk digunakan, yang juga dapat mencapai tujuan yang sama, tentu saja, tetapi objek ini juga dapat berinteraksi dengan data utas lain, yang bertentangan dengan konsep menjadi unik dalam utas.
Opsi 2
Skenario ini didasarkan pada permintaan http web, karena setiap permintaan adalah utas baru, dan kodenya adalah sebagai berikut:
Menggunakan "CallContext" di .NET Core
Kami tahu bahwa CallContext tidak lagi tersedia untuk . NETStandard atau .NET Core.
Tetapi Anda dapat menggunakan Asynclocal<T> untuk meniru CallContext, cukup buat kelas statis berikut:
Ruang nama yang perlu direferensikan:
Ini juga mudah digunakan (di sini saya telah menempatkan CallContext di perpustakaan Umum):
|