Domanda Ottenere dati dalla stored procedure con Entity Framework


Sto cercando di ottenere il contenuto di una tabella con una procedura SQL memorizzata dinamica chiamata dall'oggetto contesto del database (utilizzando Entity Framework 6.1.1), per popolare un GridView controllo. Non riesco a recuperare i dati.

Ecco la procedura memorizzata. È per una dimostrazione da studente sull'iniezione SQL nelle stored procedure, quindi LO SO questo è iniettabile e va bene.

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

Il codice C # che ho usato per eseguire la stored procedure è:

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

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

Quando eseguito, in Esplora database in Visual Studio, la stored procedure funziona correttamente. Ma quando viene eseguito nell'app ASP.NET in esecuzione, ottengo un'eccezione nel file DataBind() metodo perché result ritorna -1 invece di un IEnumerable  DataSet contenente gli oggetti risultanti dalla SELECT della procedura memorizzata.

Come posso recuperare i dati e popolare il mio GridView?


32
2017-08-21 12:50


origine


risposte:


Utilizzare la seguente procedura per risolvere questo problema:

  1. È necessario importare la stored procedure come una funzione. Fare clic con il tasto destro del mouse sull'area di lavoro del modello Entity e scegliere Add -> Function Import.
  2. Nella finestra di dialogo Aggiungi funzione di importazione, inserire il nome al quale si desidera che la procedura memorizzata venga indicata nel modello, ad esempio Search_Products, scegli la procedura dall'elenco a discesa e scegli il valore restituito dalla procedura Entities e scegliere Products dall'elenco a discesa.
  3. Quindi nel codice sottostante:

    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();
    

La ragione per cui ottieni -1 il risultato è che Entity Framework non può supportare i valori restituiti dalla stored procedure fuori dalla scatola. Penso che il supporto dei valori restituiti dalla stored procedure dipenda dalla versione del framework Entity. Anche Entity Framework non ha un ricco supporto per le stored procedure perché è un ORM, non una sostituzione SQL.


29
2017-09-02 17:04



Mi sono imbattuto in questo prima con stored procedure utilizzando SQL dinamico. Ho avuto successo usando tipi complessi se aggiungo la riga 'SET FMTONLY OFF;' (vedere https://msdn.microsoft.com/en-us/library/ms173839.aspx) all'inizio della procedura memorizzata prima che venga aggiunta al modello EF. Una volta che hai configurato il tuo modello con il tuo tipo complesso, assicurati di rimuovere questa linea.

Esempio:

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



Verifica che il tuo EDMX abbia un tipo di reso: Vai a Function Imports -> SearchProducts e fai doppio clic su di esso.

Per utilizzare un tipo di reso Complesso, Entity Framework richiederà di definire in modo esplicito i nomi delle colonne nella stored procedure anziché utilizzare *.

Una volta modificata la procedura memorizzata per definire i nomi delle colonne, è possibile aggiornare il modello nel progetto. (Nota, eseguire un drop completo dell'SP e quindi aggiungerlo nuovamente a edmx potrebbe essere il percorso migliore.)

MODIFICARE

Forse puoi modificare il tuo SP come segue:

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

0
2017-08-21 14:36



Sembra che tu abbia risolto il tuo problema, esiste una documentazione ufficiale di Microsoft disponibile ai seguenti link:

Come importare una stored procedure nel modello dati dell'entità: https://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx

Tipi complessi nel progettista EF: https://msdn.microsoft.com/en-gb/data/jj680147.aspx

Assicurati di lavorare con l'ultima versione di .net e mantieni aggiornato il tuo modello quando apporti modifiche al tuo database.


0
2017-09-08 13:43