Pertanyaan Mendapatkan data dari prosedur yang tersimpan dengan Entity Framework


Saya mencoba untuk mendapatkan konten meja dengan prosedur tersimpan SQL dinamis yang disebut dari objek konteks basis data (menggunakan Entity Framework 6.1.1), untuk mengisi GridView kontrol. Saya gagal mengambil data.

Ini prosedur tersimpan. Ini adalah untuk demonstrasi siswa tentang injeksi SQL dalam prosedur yang tersimpan, jadi AKU TAHU ini suntik dan tidak apa-apa.

ALTER PROCEDURE dbo.SearchProducts
  @SearchTerm VARCHAR(max)
AS
BEGIN
  DECLARE @query VARCHAR(max)
  SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%'''
  EXEC(@query)
END

Kode C # di belakang yang saya gunakan untuk menjalankan prosedur tersimpan adalah:

var db = new MyEntities();
var TEST_SEARCH_TERM = "product";
var result = db.SearchProducts(TEST_SEARCH_TERM);

MyGridView.DataSource = result;
MyGridView.DataBind();

Ketika dieksekusi, di Penjelajah Database di Visual Studio, prosedur tersimpan berfungsi dengan baik. Tapi ketika dijalankan dalam menjalankan aplikasi ASP.NET, saya mendapat pengecualian di DataBind() metode karena result kembali -1 bukannya sebuah IEnumerable  DataSet berisi objek yang dihasilkan dari SELECT prosedur yang tersimpan.

Bagaimana saya bisa mengambil data dan mengisi saya GridView?


32
2017-08-21 12:50


asal


Jawaban:


Gunakan langkah-langkah berikut untuk mengatasi masalah ini:

  1. Anda perlu mengimpor prosedur yang tersimpan sebagai suatu Fungsi. Klik kanan pada area ruang kerja model Entitas Anda dan pilih Add -> Function Import.
  2. Dalam dialog Tambah Fungsi Impor, masukkan nama yang Anda inginkan untuk prosedur yang tersimpan untuk dirujuk dalam model Anda misalnya Search_Products, pilih prosedur Anda dari daftar drop-down, dan pilih nilai kembalian dari prosedur yang akan dibuat Entities dan pilih Products dari daftar tarik turun.
  3. Kemudian dalam kode di belakang:

    var db = new MyEntities();
    var TEST_SEARCH_TERM = "product";
    var result = db.Search_Products(TEST_SEARCH_TERM);//Search_Products is the name that you specified in Function Import dialog
    
    MyGridView.DataSource = result;
    MyGridView.DataBind();
    

Alasan yang kamu dapatkan -1 untuk hasil adalah Kerangka Entitas tidak dapat mendukung nilai-nilai Kembali Prosedur Tersimpan di luar kotak. Saya pikir dukungan dari nilai pengembalian prosedur yang tersimpan tergantung pada versi kerangka Entitas. Kerangka Entitas juga tidak memiliki dukungan prosedur tersimpan yang kaya karena merupakan ORM, bukan pengganti SQL.


29
2017-09-02 17:04



Saya telah menemukan ini sebelumnya dengan prosedur yang tersimpan menggunakan SQL dinamis. Saya telah berhasil menggunakan jenis kompleks jika saya menambahkan baris 'SET FMTONLY OFF;' (Lihat https://msdn.microsoft.com/en-us/library/ms173839.aspx) ke bagian atas prosedur tersimpan saya sebelum ditambahkan ke model EF. Setelah Anda menyiapkan model dengan tipe kompleks Anda, pastikan untuk menghapus baris ini.

Contoh:

ALTER PROCEDURE dbo.SearchProducts
  @SearchTerm VARCHAR(max)
AS
BEGIN
  SET FMTONLY OFF;
  DECLARE @query VARCHAR(max)
  SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%'''
  EXEC(@query)
END

3
2017-09-03 20:32



Verifikasi bahwa EDMX Anda memiliki jenis pengembalian: Pergi ke Impor Fungsi -> SearchProducts, dan klik dua kali.

Untuk memanfaatkan jenis pengembalian kompleks, Entity Framework akan mengharuskan Anda secara eksplisit mendefinisikan nama kolom dalam prosedur tersimpan Anda daripada menggunakan *.

Setelah prosedur tersimpan Anda dimodifikasi untuk menentukan nama kolom, Anda dapat memperbarui model Anda dalam proyek. (Perhatikan, melakukan setetes SP lengkap, lalu menambahkannya kembali ke edmx Anda mungkin merupakan rute terbaik.)

EDIT

Mungkin Anda dapat memodifikasi SP Anda seperti berikut:

ALTER PROCEDURE dbo.SearchProducts
  @SearchTerm VARCHAR(max)
AS
BEGIN
  SELECT * FROM dbo.Products WHERE Name LIKE '%' + @SearchTerm + '%'
END

0
2017-08-21 14:36



Sepertinya Anda telah menyelesaikan masalah Anda, ada dokumentasi resmi dari Microsoft yang tersedia di tautan di bawah:

Cara mengimpor prosedur tersimpan ke dalam model data entitas Anda: https://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx

Jenis kompleks di perancang EF: https://msdn.microsoft.com/en-gb/data/jj680147.aspx

Pastikan Anda bekerja dengan versi terbaru .net dan Anda tetap memperbarui model saat membuat perubahan ke basis data Anda.


0
2017-09-08 13:43