Prosedur Tersimpan CUD Desainer
Panduan langkah demi langkah ini menunjukkan cara memetakan operasi create\insert, update, dan delete (CUD) dari jenis entitas ke prosedur tersimpan menggunakan Entity Framework Designer (EF Designer). Secara default, Kerangka Kerja Entitas secara otomatis menghasilkan pernyataan SQL untuk operasi CUD, tetapi Anda juga dapat memetakan prosedur tersimpan ke operasi ini.
Perhatikan bahwa Code First tidak mendukung pemetaan ke prosedur atau fungsi tersimpan. Namun, Anda dapat memanggil prosedur atau fungsi tersimpan dengan menggunakan metode System.Data.Entity.DbSet.SqlQuery. Contohnya:
var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]");
Pertimbangan saat Memetakan Operasi CUD ke Prosedur Tersimpan
Saat memetakan operasi CUD ke prosedur tersimpan, pertimbangan berikut berlaku:
- Jika Anda memetakan salah satu operasi CUD ke prosedur tersimpan, petakan semuanya. Jika Anda tidak memetakan ketiganya, operasi yang tidak dipetakan akan gagal jika dijalankan dan UpdateException akan dilemparkan.
- Anda harus memetakan setiap parameter prosedur tersimpan ke properti entitas.
- Jika server menghasilkan nilai kunci utama untuk baris yang disisipkan, Anda harus memetakan nilai ini kembali ke properti kunci entitas. Dalam contoh berikut, prosedur tersimpan InsertPerson mengembalikan kunci primer yang baru dibuat sebagai bagian dari tataan hasil prosedur tersimpan. Kunci utama dipetakan ke kunci entitas (PersonID) menggunakan< fitur Tambahkan Pengikatan> Hasil dari Desainer EF.
- Panggilan prosedur tersimpan dipetakan 1:1 dengan entitas dalam model konseptual. Misalnya, jika Anda menerapkan hierarki warisan dalam model konseptual Anda dan kemudian memetakan prosedur tersimpan CUD untuk entitas Induk (dasar) dan Anak (turunan), menyimpan perubahan Anak hanya akan memanggil prosedur Tersimpan Anak, itu tidak akan memicu panggilan prosedur tersimpan Induk.
Prasyarat
Untuk menyelesaikan panduan ini, Anda memerlukan:
Menyiapkan Proyek
- Buka Visual Studio 2012.
- Pilih File-> Baru -> Proyek
- Di panel kiri, klik Visual C#, lalu pilih templat Konsol .
- Masukkan CUDSProcsSample sebagai nama.
- PilihOK.
Buat model
Klik kanan nama proyek di Penjelajah Solusi, dan pilih Tambahkan -> Item Baru.
Pilih Data dari menu sebelah kiri lalu pilih ADO.NET Model Data Entitas di panel Templat.
Masukkan CUDSProcs.edmx untuk nama file, lalu klik Tambahkan.
Dalam kotak dialog Pilih Konten Model, pilih Hasilkan dari database, lalu klik Berikutnya.
Klik Koneksi baru. Dalam kotak dialog Properti Koneksi ion, masukkan nama server (misalnya, (localdb)\mssqllocaldb), pilih metode autentikasi, ketik Sekolah untuk nama database, lalu klik OK. Kotak dialog Pilih Koneksi si Data Anda diperbarui dengan pengaturan koneksi database Anda.
Dalam kotak dialog Pilih Objek Database Anda, di bawah simpul Tabel , pilih tabel Orang .
Selain itu, pilih prosedur tersimpan berikut di bawah simpul Prosedur dan Fungsi Tersimpan : DeletePerson, InsertPerson, dan UpdatePerson.
Dimulai dengan Visual Studio 2012, EF Designer mendukung impor massal prosedur tersimpan. Mengimpor prosedur dan fungsi tersimpan yang dipilih ke dalam model entitas diperiksa secara default. Karena dalam contoh ini kami telah menyimpan prosedur yang menyisipkan, memperbarui, dan menghapus jenis entitas, kami tidak ingin mengimpornya dan akan menghapus centang pada kotak centang ini.
Klik Selesai. Desainer EF, yang menyediakan permukaan desain untuk mengedit model Anda, ditampilkan.
Memetakan Entitas Orang ke Prosedur Tersimpan
Klik kanan jenis entitas Orang dan pilih Pemetaan Prosedur Tersimpan.
Pemetaan prosedur tersimpan muncul di jendela Detail Pemetaan.
Klik <Pilih Sisipkan Fungsi>. Bidang menjadi daftar drop-down prosedur tersimpan dalam model penyimpanan yang dapat dipetakan ke jenis entitas dalam model konseptual. Pilih InsertPerson dari daftar drop-down.
Pemetaan default antara parameter prosedur tersimpan dan properti entitas muncul. Perhatikan bahwa panah menunjukkan arah pemetaan: Nilai properti disediakan ke parameter prosedur tersimpan.
Klik <Tambahkan Pengikatan> Hasil.
Ketik NewPersonID, nama parameter yang dikembalikan oleh prosedur tersimpan InsertPerson . Pastikan untuk tidak mengetik spasi di depan atau di belakang.
Tekan Enter.
Secara default, NewPersonID dipetakan ke personID kunci entitas. Perhatikan bahwa panah menunjukkan arah pemetaan: Nilai kolom hasil disediakan ke properti .
Klik <Pilih Perbarui Fungsi> dan pilih UpdatePerson dari daftar drop-down yang dihasilkan.
Pemetaan default antara parameter prosedur tersimpan dan properti entitas muncul.
Klik <Pilih Hapus Fungsi> dan pilih DeletePerson dari daftar drop-down yang dihasilkan.
Pemetaan default antara parameter prosedur tersimpan dan properti entitas muncul.
Operasi sisipkan, perbarui, dan hapus dari jenis entitas Orang sekarang dipetakan ke prosedur tersimpan.
Jika Anda ingin mengaktifkan pemeriksaan konkurensi saat memperbarui atau menghapus entitas dengan prosedur tersimpan, gunakan salah satu opsi berikut:
- Gunakan parameter OUTPUT untuk mengembalikan jumlah baris yang terpengaruh dari prosedur tersimpan dan centang kotak Centang Parameter Yang Terpengaruh Baris di samping nama parameter. Jika nilai yang dikembalikan adalah nol ketika operasi dipanggil, OptimisticConcurrencyException akan dilemparkan.
- Centang kotak centang Gunakan Nilai Asli di samping properti yang ingin Anda gunakan untuk pemeriksaan konkurensi. Ketika pembaruan dicoba, nilai properti yang awalnya dibaca dari database akan digunakan saat menulis data kembali ke database. Jika nilai tidak cocok dengan nilai dalam database, OptimisticConcurrencyException akan dilemparkan.
Menggunakan Model
Buka file Program.cs tempat metode Utama ditentukan. Tambahkan kode berikut ke fungsi Utama.
Kode membuat objek Orang baru, lalu memperbarui objek, dan akhirnya menghapus objek.
using (var context = new SchoolEntities())
{
var newInstructor = new Person
{
FirstName = "Robyn",
LastName = "Martin",
HireDate = DateTime.Now,
Discriminator = "Instructor"
}
// Add the new object to the context.
context.People.Add(newInstructor);
Console.WriteLine("Added {0} {1} to the context.",
newInstructor.FirstName, newInstructor.LastName);
Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
newInstructor.PersonID);
// SaveChanges will call the InsertPerson sproc.
// The PersonID property will be assigned the value
// returned by the sproc.
context.SaveChanges();
Console.WriteLine("After SaveChanges, the PersonID is: {0}",
newInstructor.PersonID);
// Modify the object and call SaveChanges.
// This time, the UpdatePerson will be called.
newInstructor.FirstName = "Rachel";
context.SaveChanges();
// Remove the object from the context and call SaveChanges.
// The DeletePerson sproc will be called.
context.People.Remove(newInstructor);
context.SaveChanges();
Person deletedInstructor = context.People.
Where(p => p.PersonID == newInstructor.PersonID).
FirstOrDefault();
if (deletedInstructor == null)
Console.WriteLine("A person with PersonID {0} was deleted.",
newInstructor.PersonID);
}
- Kompilasi dan jalankan aplikasi. Program ini menghasilkan output berikut *
Catatan
PersonID dibuat secara otomatis oleh server, sehingga Kemungkinan besar Anda akan melihat angka yang berbeda*
Added Robyn Martin to the context.
Before SaveChanges, the PersonID is: 0
After SaveChanges, the PersonID is: 51
A person with PersonID 51 was deleted.
Jika Anda bekerja dengan Visual Studio versi Ultimate, Anda dapat menggunakan Intellitrace dengan debugger untuk melihat pernyataan SQL yang dieksekusi.