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?
- Invoca la stored, passando tutti i parametri a null,
- 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:
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).
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