Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Select con stored procedures in entity framework

    Ciao a tutti.
    Sto sviluppando in C#, framework 4.0, un applicazione web. Per la prima volta mi trovo ad usare l'entity framework. Attraverso Visual Studio (2010), ho importato tabelle e stored procedures dal DB. Per una tabella, ho fatto il mapping stored procedure per la insert, la delete e la update. Questo mi permette, se non erro, di ricorrrere ad esse ( le stored procedures) nelle fasi di cancellazione, modifica e creazione, quando uso un EntityDataSource.

    Non riesco tuttavia ad utilizzare una stored procedure di select per mappare anche così la mia entità.

    Avreste qualche dritta da darmi?

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    La select non si può mappare.

    Per poter usare una select con una store procedure va creata la store procedure e mapparla in EF come una store procedure normale utilizzando come tipo restituito una collezione di tue entità.

    Non è proprio comodissimo ma credo che di più non si possa fare.

  3. #3
    Grazie.
    Essendo alle prime armi in ambiente .NET, sto sfruttando molto l'ambiente visuale di VisualStudio 2010. Ergo ti chiedo se sai darmi qualche dritta sulla procedura da compiere in tale ambiente:

    - Se non erro importare una stored procedure con EF è piuttosto semplice, e si può fare attraverso l'aggiornamento del modello da DB;

    - Se ho ben capito mi serve un'entità che rappresenti l'output della stored procedure in questione;

    Vorrei quindi chiederti come si può fare a definire, in ambiente visuale, l'uotput della sp con l'entità in questione.

    Grazie ancora.

  4. #4
    PS: una curiosità, se conosci la risposta: mi viene da pensare che l'impossibilità di mappare un'entità con una stored procedure in SELECT sia in qualche modo voluta da Microsoft... In tal caso mi sfugge il perchè di tale scelta. Perchè dovrebbe essere sconsigliata tale procedura?

  5. #5
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Se la tua store procedure ritorna una collezione di oggetti che hai gia mappato (come immagino visto che la fai al posto di una select) devi impostare, nella finestra di mapping della storeprocedure, come output una collezione di tuoi oggetti mappati in EF.

    ES: hai una tabella UTENTI e vuoi fare una select con store procedure. Nella finestra di mapping della store devi impostare come output una lista di UTENTI.

    Ovviamente questo va bene se ritorni effettivamente una lista di UTENTI. Altrimenti devi crearti prima un "Oggetto Complesso" (se hai VS in inglese è Complex Object) che non è altro che la rappresentazione dell'output custom della tua store procedure.
    LINK

  6. #6
    Ok, ho provato un po' a smanettare e credo di esserci abbastanza. Un'ultima cosa se puoi: ipotizziamo che io abbia una select complessa, con dei join tra più tabelle sul DB. Quello che mi restituisce è una tabella di record non riconducibili a nessuna tabella sul DB. Supponiamo anche che non voglia fare una vista.

    In questo caso devo utilizzare la stored procedure facendole restituire un ComplexType, giusto? Questo complexType, tuttavia, non ho bisogno di mapparlo con il DB perchè le stored procedure sono già esse mappate giusto? Il legame tra DB e EntityModel persiste?

    Dopodichè mi basta bindare supponiamo una grindview con... che cosa? Posso farlo utilizzando il cpmplextype?=


    Scusa, sono ancora in una prima fase e sto cercando di raccapezzarmi.

  7. #7
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Un si a tutte le tue domande.

    Attenzione che, un complex type, che io sappia, non mantiene il collegamento al db che hai con un oggetto mappato.
    Ad esempio, se modifichi un valore, non credo che un "SaveChanges()" riesca a salvarlo in DB.

    Su questo non ho fatto nessun test.

  8. #8
    C'è una cosa che ancora non mi quadra: se utilizzassi un EntitySet, invece che un complextype, l'entità in questione dovrebbe essere mappata con il DB, e dovrebbe rispecchiare fedelmente una tabella nel DB stesso. Dovrei cioè importare attraverso il Tool una tabella del db all'interno del mio modello. Poi ci mappo sopra la mia stored procedure, anch'essa importata dal DB.

    Ma scusa, se già la stored procedure è mappata, non dovrebbe servirmi un'entità anch'essa mappata con il DB giusto?
    Ti spiego come sono giunto a questa domanda:

    Se io volessi crearmi un'entità a mano sul mio modello, per poi mapparla al DB, non posso a meno che questa non corrisponda perfettamente ad una tabella sul DB stesso. Nel caso non ci sia corrispondenza entità/tabella dovrei usare un complextype, ma questo non è mappabile con il DB.

    Azz, mi sa che mi manca qualche concetto basilare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.