Procedura dettagliata: generazione di tipi F# da un file di schema EDMX (F#)

Questa procedura dettagliata per F# 3.0 spiega come creare tipi per dati rappresentati da Entity Data Model (EDM), lo schema per il quale è specificato in un file .edmx. Questa procedura dettagliata illustra inoltre come utilizzare il provider di tipi EdmxFile. Prima di iniziare, considerare se un provider di tipi SqlEntityConnection sia un'opzione più appropriata. Il provider di tipi SqlEntityConnection è ideale per scenari in cui si ha un database attivo che è possibile connettere durante la fase di sviluppo del progetto e non ci si ricorda di specificare la stringa di connessione in fase di compilazione. Tuttavia, questo provider di tipi è limitato in quanto non espone così tante funzionalità di database come il provider di tipi EdmxFile. Inoltre, se non si dispone di una connessione attiva per un progetto di database che utilizza Entity Data Model, è possibile utilizzare il file .edmx per scrivere codice rispetto al database. Quando si utilizza il provider di tipi EdmxFile, il compilatore F# esegue EdmGen.exe per generare i tipi che fornisce.

In questa procedura dettagliata vengono illustrate le seguenti attività, che è necessario eseguire in quest'ordine perché la procedura abbia esito positivo:

  • Creazione di un file EDMX

  • Creazione del progetto

  • Ricerca o creazione di una stringa di connessione per Entity Data Model

  • Configurazione del provider di tipi

  • Esecuzione di una query sui dati

  • Chiamata di una stored procedure

Creazione di un file EDMX

Se si dispone già di un file EDMX, è possibile ignorare questo passaggio.

Per creare un file EDMX

  • Se non è già presente un file EDMX, è possibile seguire le istruzioni riportate alla fine di questa procedura dettagliata nel passaggio Per configurare il modello Entity Data Model.

Creazione del progetto

In questo passaggio viene creato un progetto e vengono aggiunti i riferimenti appropriati per utilizzare il provider di tipi EDMX.

Per creare e configurare un progetto F#

  1. Chiudere il progetto precedente, creare un altro progetto e denominarlo SchoolEDM.

  2. In Esplora soluzioni aprire il menu di scelta rapida Riferimenti, quindi scegliere Aggiungi riferimento.

  3. Nell'area Assembly selezionare il nodo Framework.

  4. Nell'elenco di assembly disponibili, selezionare gli assembly System.Data.Linq e System.Data.Entity, quindi premere Aggiungi per aggiungere al progetto i riferimenti a questi assembly.

  5. Nell'area Assembly selezionare il nodo Estensioni.

  6. Nell'elenco delle estensioni disponibili aggiungere un riferimento all'assembly FSharp.Data.TypeProviders.

  7. Aggiungere il codice seguente per aprire gli spazi dei nomi appropriati.

    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    

Ricerca o creazione della stringa di connessione per Entity Data Model

La stringa di connessione per Entity Data Model (stringa di connessione EDMX) non include solo la stringa di connessione per il provider del database ma anche informazioni aggiuntive. Ad esempio, la stringa di connessione EDMX per un semplice database SQL Server è simile al seguente codice.

let edmConnectionString = "metadata=res://*/;provider=System.Data.SqlClient;Provider Connection String='Server=SERVER\Instance;Initial Catalog=DatabaseName;Integrated Security=SSPI;'"

Per ulteriori informazioni sulle stringhe di connessione EDMX, vedere Stringhe di connessione.

Per trovare o creare la stringa di connessione per Entity Data Model

  • Le stringhe di connessione EDMX possono essere difficili da generare manualmente, pertanto è possibile risparmiare tempo generandola a livello di programmazione. Se si conosce la stringa di connessione EDMX, è possibile ignorare questo passaggio e utilizzare semplicemente tale stringa nel passaggio successivo. In caso contrario, utilizzare il codice seguente per generare la stringa di connessione EDMX da una stringa di connessione del database fornito.

    open System
    open System.Data
    open System.Data.SqlClient
    open System.Data.EntityClient
    open System.Data.Metadata.Edm
    
    let getEDMConnectionString(dbConnectionString) =
        let dbConnection = new SqlConnection(connectionString)
        let resourceArray = [| "res://*/" |]
        let assemblyList = [| System.Reflection.Assembly.GetCallingAssembly() |]
        let metaData = MetadataWorkspace(resourceArray, assemblyList)
        new EntityConnection(metaData, dbConnection)
    

Configurazione del provider di tipi

In questo passaggio viene creato e configurato il provider di tipi con la stringa di connessione EDMX e vengono generati i tipi per lo schema definito nel file .edmx.

Per configurare il provider di tipi e generare i tipi

  1. Copiare il file .edmx, che è stato generato nel primo passaggio di questa procedura guidata, nella cartella del progetto.

  2. Aprire il menu di scelta rapida del nodo del progetto nel progetto F#, scegliere Aggiungi elemento esistente, quindi selezionare il file .edmx per aggiungerlo al progetto.

  3. Digitare il seguente codice per attivare il provider di tipi per il file .edmx. Sostituire Server\Instance con il nome del server che esegue SQL Server e il nome dell'istanza, quindi utilizzare il nome del file .edmx del primo passaggio di questa procedura guidata.

    type edmx = EdmxFile<"Model1.edmx", ResolutionFolder = @"<folder that contains your .edmx file>>
    
    let edmConnectionString =
        getEDMConnectionString("Data Source=SERVER\instance;Initial Catalog=School;Integrated Security=true;")
    let context = new edmx.SchoolModel.SchoolEntities(edmConnectionString)
    

Esecuzione di una query sui dati

In questo passaggio utilizzare le espressioni di query F# per eseguire una query sul database.

Per eseguire una query sui dati

  • Digitare il codice seguente per eseguire una query sui dati in Entity Data Model.

    query { for course in context.Courses do
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    query { for person in context.Person do
            select person }
    |> Seq.iter (fun person -> printfn "%s %s" person.FirstName person.LastName)
    
    // Add a where clause to filter results
    query { for course in context.Courses do
            where (course.DepartmentID = 1)
            select course)
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    // Join two tables
    query { for course in context.Courses do
            join (for dept in context.Departments -> course.DepartmentID = dept.DepartmentID)
            select (course, dept.Name) }
    |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
    

Chiamata di una stored procedure

È possibile chiamare stored procedure utilizzando il provider di tipi EDMX. Nella procedura riportata in seguito il database School contiene una stored procedure, UpdatePerson, che aggiorna un record, specificando i nuovi valori delle colonne. È possibile seguire questa stored procedure in quanto è esposta come metodo sul tipo DataContext.

Per chiamare una stored procedure

  • Aggiungere il seguente codice per aggiornare i record.

    // Call a stored procedure.
    let nullable value = new System.Nullable<_>(value)
    
    // Assume now that you must correct someone's hire date.
    // Throw an exception if more than one matching person is found.
    let changeHireDate(lastName, firstName, hireDate) =
    
        query { for person in context.People do
                where (person.LastName = lastName &&
                       person.FirstName = firstName)
                exactlyOne }
        |> (fun person ->
                context.UpdatePerson(nullable person.PersonID, person.LastName,
                    person.FirstName, nullable hireDate, person.EnrollmentDate))
    
    changeHireDate("Abercrombie", "Kim", DateTime.Parse("1/12/1998"))
    |> printfn "Result: %d"
    

    Il risultato è 1 se si ha esito positivo. Si noti che exactlyOne viene utilizzato nell'espressione di query per garantire che un solo risultato sia restituito; in caso contrario, viene generata un'eccezione. Inoltre, per utilizzare valori nullable più facilmente, è possibile utilizzare la semplice funzione nullable definita in questo codice per creare un valore nullable da un valore comune.

Configurazione di Entity Data Model

È consigliabile completare questa procedura solo se si desidera sapere come generare un Entity Data Model completo da un database e non si dispone di un database con il quale testarlo.

Per configurare Entity Data Model

  1. Sulla barra dei menu scegliere SQL, Editor Transact-SQL, Nuova query per creare un database. Se richiesto, specificare il server di database e l'istanza.

  2. Copiare e incollare il contenuto dello script di database che crea il database Student, come descritto nella documentazione di Entity Framework nel Centro per sviluppatori di dati.

  3. Eseguire lo script SQL scegliendo il pulsante sulla barra degli strumenti con il simbolo del triangolo o premendo Ctrl+Q.

  4. In Esplora server aprire il menu di scelta rapida per Connessioni dati, scegliere Aggiungi connessione, quindi immettere il nome del server di database, il nome dell'istanza e il database School.

  5. Creare un progetto di applicazione console di Visual Basic o C#, aprire il suo menu di scelta rapida, scegliere Aggiungi nuovo elemento quindi scegliere ADO.NET Entity Data Model.

    Verrà aperta la Procedura guidata Entity Data Model. Utilizzando questa procedura guidata è possibile scegliere la modalità di creazione di Entity Data Model.

  6. In Scegli contenuto del modello selezionare la casella di controllo Genera da database.

  7. Nella pagina successiva scegliere il database School appena creato come connessione dati.

    Questa connessione dovrebbe essere simile a <servername>.<instancename>.School.dbo.

  8. Copiare la stringa di connessione a entità negli Appunti perché tale stringa potrebbe essere importante successivamente.

  9. Assicurarsi che la casella di controllo per salvare la stringa di connessione a entità nel file App.Config sia selezionata e prendere nota della stringa nella casella di testo, che dovrebbe essere utile per individuare la stringa di connessione più avanti, se necessario.

  10. Nella pagina successiva scegliere Tabelle e Stored procedure e funzioni.

    Scegliendo questi nodi di primo livello, si scelgono tutte le tabelle, le stored procedure e le funzioni. È anche possibile selezionarle individualmente, se lo si desidera.

  11. Verificare che le caselle di controllo per le altre impostazioni siano selezionate.

    La prima casella di controllo Rendi plurali o singolari i nomi degli oggetti generati indica se modificare le forme singolari in plurale per soddisfare le convenzioni di denominazione degli oggetti che rappresentano le tabelle del database. La casella di controllo Includi colonne chiavi esterne nel modello determina se includere i campi il cui scopo è di unirsi ad altri campi nei tipi di oggetti generati per lo schema del database. La terza casella di controllo indica se includere stored procedure e funzioni nel modello.

  12. Premere Fine per generare un file .edmx contenente un Entity Data Model basato sul database School.

    Un file, Model1.edmx, viene aggiunto al progetto e viene visualizzato il diagramma di un database.

  13. Nella barra dei menu scegliere Visualizza, Altre finestre, Browser Entity Data Model per visualizzare tutti i dettagli del modello o Dettagli mapping Entity Data Model per aprire una finestra che mostra come il modello a oggetti generato esegue il mapping nelle tabelle e nelle colonne del database.

Passaggi successivi

Esplorare altre query esaminando gli operatori di query disponibili come indicato in Espressioni di query (F#).

Vedere anche

Attività

Procedura dettagliata: accesso a un database SQL tramite entità e provider di tipi (F#)

Riferimenti

Provider di tipo EdmxFile (F#)

Generatore EDM (EdmGen.exe)

Altre risorse

Provider di tipi

Entity Framework

.edmx File Overview (Entity Framework)