Saya sangat baru di Entity Framework 6 dan saya ingin menerapkan prosedur tersimpan di proyek saya. Saya memiliki prosedur tersimpan sebagai berikut:
ALTER PROCEDURE [dbo].[insert_department]
@Name [varchar](100)
AS
BEGIN
INSERT [dbo].[Departments]([Name])
VALUES (@Name)
DECLARE @DeptId int
SELECT @DeptId = [DeptId]
FROM [dbo].[Departments]
WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()
SELECT t0.[DeptId]
FROM [dbo].[Departments] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END
Department
kelas:
public class Department
{
public int DepartmentId { get; set; }
public string Name { get; set; }
}
modelBuilder
.Entity<Department>()
.MapToStoredProcedures(s =>
s.Update(u => u.HasName("modify_department")
.Parameter(b => b.Department, "department_id")
.Parameter(b => b.Name, "department_name"))
.Delete(d => d.HasName("delete_department")
.Parameter(b => b.DepartmentId, "department_id"))
.Insert(i => i.HasName("insert_department")
.Parameter(b => b.Name, "department_name")));
protected void btnSave_Click(object sender, EventArgs e)
{
string department = txtDepartment.text.trim();
// here I want to call the stored procedure to insert values
}
Masalah saya adalah: bagaimana saya bisa memanggil prosedur tersimpan dan mengirimkan parameter ke dalamnya?
Jawaban:
Anda dapat memanggil prosedur tersimpan di
DbContext
kelas Anda sebagai berikut.Tetapi jika prosedur tersimpan Anda mengembalikan beberapa set hasil sebagai kode sampel Anda, maka Anda dapat melihat artikel bermanfaat ini di MSDN
Prosedur Tersimpan dengan Kumpulan Hasil Berganda
sumber
"storedProcedureName @param1, @param2"
. Juga jenisparams
iniSystem.Data.SqlClient.SqlParameter[]
.this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Yang harus Anda lakukan adalah membuat objek yang memiliki nama properti yang sama dengan hasil yang dikembalikan oleh prosedur tersimpan. Untuk prosedur tersimpan berikut:
buat kelas yang terlihat seperti:
dan kemudian panggil prosedur dengan melakukan hal berikut:
Hasilnya akan berisi daftar
ResultForCampaign
objek. Anda dapat meneleponSqlQuery
menggunakan parameter sebanyak yang diperlukan.sumber
Saya menyelesaikannya dengan
ExecuteSqlCommand
Masukkan metode Anda sendiri seperti milik saya di DbContext sebagai contoh Anda sendiri:
sehingga Anda dapat memiliki metode di belakang kode Anda seperti ini:
ini SP saya:
semoga membantu anda
sumber
Menggunakan contoh Anda, berikut adalah dua cara untuk mencapai ini:
1 - Gunakan pemetaan prosedur Tersimpan
Perhatikan bahwa kode ini akan berfungsi dengan atau tanpa pemetaan. Jika Anda mematikan pemetaan pada entitas, EF akan menghasilkan pernyataan insert + select.
2 - Hubungi prosedur yang tersimpan secara langsung
Saya sarankan menggunakan pendekatan pertama, karena Anda dapat bekerja dengan objek departemen secara langsung dan tidak harus membuat banyak objek SqlParameter.
sumber
Anda menggunakan
MapToStoredProcedures()
yang menunjukkan bahwa Anda memetakan entitas Anda ke prosedur tersimpan, saat melakukan ini Anda harus melepaskan fakta bahwa ada prosedur tersimpan dan menggunakancontext
seperti biasa. Sesuatu seperti ini ( ditulis ke dalam browser jadi tidak diuji )Jika semua yang Anda benar-benar coba lakukan adalah memanggil prosedur tersimpan secara langsung kemudian gunakan
SqlQuery
sumber
.MapToStoredProcedures(s =>
. Panggilan keAdd
harus diselesaikan ke.Insert(i => i.HasName("insert_department")
Sekarang Anda juga dapat menggunakan konvensi yang saya buat yang memungkinkan menjalankan prosedur tersimpan (termasuk prosedur tersimpan yang mengembalikan banyak hasil), TVF dan UDF skalar yang berasal dari EF.
Baca lebih lajut
Baca lebih lanjut .
sumber
sumber
Ini bekerja untuk saya dengan menarik kembali data dari prosedur yang tersimpan sambil mengirimkan parameter.
_db
adalah dbContextsumber
Lihatlah tautan ini yang menunjukkan cara kerja pemetaan EF 6 dengan Prosedur Tersimpan untuk membuat Sisipan, Perbarui, dan Hapus: http://msdn.microsoft.com/en-us/data/dn468673
Tambahan
Berikut adalah contoh yang bagus untuk memanggil prosedur tersimpan dari Code First:
Katakanlah Anda harus menjalankan Prosedur Tersimpan dengan satu parameter, dan Prosedur Tersimpan mengembalikan satu set data yang cocok dengan Entity States, jadi kami akan memiliki ini:
Sekarang katakanlah kita ingin menjalankan prosedur tersimpan lainnya dengan dua parameter:
Perhatikan bahwa kami menggunakan penamaan berbasis indeks untuk parameter. Ini karena Entity Framework akan membungkus parameter ini sebagai objek DbParameter dari Anda untuk menghindari masalah injeksi SQL.
Semoga contoh ini membantu!
sumber
sumber
Ini bekerja untuk saya pada kode terlebih dahulu. Ini mengembalikan daftar dengan properti model tampilan yang cocok (StudentChapterCompletionViewModel)
Diperbarui untuk Konteks
Konteks adalah turunan dari kelas yang mewarisi DbContext seperti di bawah ini.
sumber
Penumpang yang tidak memiliki pikiran memiliki proyek yang memungkinkan beberapa set hasil dikembalikan dari proc yang disimpan menggunakan kerangka entitas. Salah satu contohnya di bawah ini ....
sumber
Anda dapat meneruskan parameter ke
sp_GetById
dan mengambil hasilnya diToList()
atauFirstOrDefault();
sumber
jika Anda ingin meneruskan params tabel ke dalam prosedur tersimpan, Anda harus mengatur properti TypeName untuk params tabel Anda.
sumber
Inilah yang dihasilkan EF (DB terlebih dahulu) di kelas DbContext:
sumber
Ketika EDMX membuat waktu ini jika Anda memilih tersimpan diproses dalam opsi tabel pilih kemudian panggil toko diproses dengan menggunakan nama prosedur ...
sumber
Saya menemukan bahwa memanggil Prosedur Tersimpan dalam pendekatan Code First tidak nyaman. Saya lebih suka menggunakan
Dapper
sebagai gantinyaKode berikut ditulis dengan
Entity Framework
:Kode berikut ditulis dengan
Dapper
:Saya percaya potongan kode kedua lebih mudah dimengerti.
sumber
sumber
Tidak ada hubungannya ... ketika Anda membuat dbcontext untuk pendekatan kode pertama inisialisasi namespace di bawah area API yang lancar membuat daftar sp dan menggunakannya tempat lain di mana Anda inginkan.
}
sumber
Menggunakan pendekatan kerangka kerja MySql dan Entity pertama:
sumber
Buat Prosedur di MYsql.
Buat kelas yang berisi prosedur yang disimpan mengembalikan nilai yang ditetapkan nilai
Tambahkan Kelas di Dbcontext
Panggil entitas dalam repositori
sumber