lunedì 3 novembre 2014

Entity Framework - The stored procedure return no columns in the model creation

Accade molto spesso di dover utilizzare stored procedure dinamiche o che utilizzano tabelle temporanee per la selezione dei dati.

Se andassimo a mappare queste stored procedure, nel model dell'Entity Framework, il wizard non riuscirebbe a recuperare le informazioni dei metadata, restituiti dalla stored.

L'EF non supporta l'importazione di stored procedure che per la costruzione dei risultati utilizzano:
  • Query dinamiche
  • Tabelle temporanee
Come si comporta l'EF quando tenta di mappare una stored procedure nel model, recuperando i metadati?
  1. Invoca la stored, passando tutti i parametri a null, 
  2. Per prevenire qualunque operazione pericolosa che possa comportare variazioni sul database, esegue il comando prima della sua esecuzione
Tramite questo comando, la stored procedure ritornerà solo i metadati delle colonne e il loro risultato, ma la logica interna non verrà eseguita.
Ma poichè la logica non viene eseguita dal wizard, negli scenari con tabelle temporanee o query dinamiche, la struttura dei metadati risulterà vuota.

A questo punto si hanno due scelte per ovviare a questo problema:

  • Definire manualmente un complex type di ritorno
  • Aggiungere in testa alla stored procedure
Quest'ultimo comando permette al codice della stored di essere eseguito normalmente, eseguendo completamente la logica all'interno definita.

Ma come fare fare a introdurre questo comando nella stored procedure evitando di toglierlo e rimetterlo in ogni compilazione?
Introducendo questo IF statment in cima alla stored:

Quando FMTONLY è settato a on (dal wizard di import dell'EF), l'esecuzione della stored procedure causa uno strano comportamento che permette di ignorare le istruzioni condizionali (come nel nostro caso IF 1=0), ignorando ogni qualsiasi logica e ritornando il possibile set di risultati che il codice della stored genera.

In questo modo è possibile introdurre il trick:
l'IF non verrà considerato nella normale esecuzione della stored, ma solamente quando FMTONLY è ON (wizard).

Nessun commento:

Posta un commento