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

Questa procedura dettagliata per F# 3.0 illustra come accedere ai dati tipizzati per un database SQL basato su ADO.NET Entity Data Model.In questa procedura dettagliata viene illustrato come configurare il provider di tipo SqlEntityConnection di F# per l'utilizzo con un database SQL, come scrivere query sui dati, ad esempio stored procedures nel database e come utilizzare alcuni dei tipi e dei metodi di ADO.NET Entity Framework per aggiornare il database.

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

  • Creare il database School..

  • Creare e configurare un progetto F#.

  • Configurare il provider di tipo e connettersi a Entity Data Model.

  • Esecuzione di query nel database.

  • Aggiornamento del database

Prerequisiti

È necessario avere accesso a un server che sta eseguendo SQL Server e in cui è possibile creare un database, per completare questa procedura.

Creare il database School.

È possibile creare il database School in qualsiasi server che esegue SQL Server a cui si ha accesso come amministratore, oppure è possibile utilizzare LocalDB.

Per creare il database School.

  1. In Esplora server, aprire il menu di scelta rapida del nodo Connessioni dati, quindi scegliere Aggiungi connessione.

    Verrà visualizzata la finestra di dialogo Aggiungi connessione.

  2. Nella casella Nome server, specificare il nome di un'istanza di SQL Server a cui è possibile accedere come amministratore, oppure specificare (localdb \ v11.0) se non si ha accesso a un server.

    SQL Server Express LocalDB fornisce un server database semplice per lo sviluppo e il test nel proprio computer.Per ulteriori informazioni su LocalDB, vedere Procedura dettagliata: creazione di un database LocalDB.

    Un nuovo nodo viene creato in Esplora server in Connessioni dati.

  3. Aprire il menu di scelta rapida per il nuovo nodo della connessione e quindi scegliere Nuova query.

  4. Aprire Creare il database di esempio School nel sito Web Microsoft e quindi copiare e incollare lo script che crea il database Student nella finestra dell'editor.

    I passaggi successivi di questa procedura dettagliata sono basati sul seguente tutorial: ADO.NET Entity Data Model Quickstart.

Creare e configurare un progetto F#

In questo passaggio, viene creato un progetto e viene impostato l'utilizzo di un provider di tipo.

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. Scegliere il nodo Framework quindi, nell'elenco Framework, scegliere System.Data, System.Data.Entitye System.Data.Linq.

  4. Scegliere il nodo Estensioni, aggiungere un riferimento all'assembly FSharp.Data.TypeProviders, quindi scegliere il pulsante OK per chiudere la finestra di dialogo.

  5. Aggiungere il codice seguente per definire un modulo interno e aprire gli spazi dei nomi appropriati.Il provider di tipo può inserire i tipi solo in uno spazio dei nomi privato o interno.

    module internal SchoolEDM
    
    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    
  6. Per eseguire il codice in questa procedura dettagliata interattivamente come script anziché come programma compilato, aprire il menu di scelta rapida del nodo del progetto, scegliere Aggiungi nuovo elemento, aggiungere un file di script F# e quindi aggiungere il codice a ogni passaggio allo script.Per caricare i riferimenti agli assembly, aggiungere le righe seguenti.

    #r "System.Data.Entity.dll"
    #r "FSharp.Data.TypeProviders.dll"
    #r "System.Data.Linq.dll"
    
  7. Evidenziare ogni blocco di codice come per aggiungerlo e premere ALT+INVIO per eseguirlo in F# interactive.

Configurare il provider di tipo e connettersi a Entity Data Model

In questo passaggio, si installa un provider di tipo con una connessione dati e si ottiene un contesto dati che consente di lavorare con i dati.

Per configurare il provider di tipo e connettersi a Entity Data Model

  1. Digitare il codice seguente per configurare il provider di tipo SqlEntityConnection che genera i tipi F# basati su l' Entity Data Model creato precedentemente.Anziché la completa stringa di connessione EDMX, utilizzare solo la stringa di connessione SQL.

    type private EntityConnection = SqlEntityConnection<ConnectionString="Server=SERVER\InstanceName;Initial Catalog=School;Integrated Security=SSPI;MultipleActiveResultSets=true",
                                                        Pluralize = true>
     >
    

    Questa azione installa un provider di tipo con la connessione al database creato precedentemente.La proprietà MultipleActiveResultSets è necessaria quando si utilizzano ADO.NET Entity Framework poiché questa proprietà consente di eseguire più controlli in modo asincrono nel database in una connessione, cosa che può verificarsi frequentemente nel codice ADO.NET Entity Framework.Per ulteriori informazioni, vedere Multiple Active Result Set (MARS).

  2. Ottenere il contesto dati, che è un oggetto contenente le tabelle del database come proprietà e le stored procedure e le funzioni del database come metodi.

    let context = EntityConnection.GetDataContext()
    

Esecuzione di query nel database

In questo passaggio, si utilizzano le espressioni di query F# per eseguire varie query sul database.

Per eseguire una query sui dati

  • Digitare il codice seguente per analizzare i dati provenienti dall' Entity Data Model.Notare l'effetto Pluralize = true, che modifica la tabella del database Course in Courses e la tabella Person in People.

    query { for course in context.Courses do
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    query { for person in context.People 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 dept in context.Departments on (course.DepartmentID = dept.DepartmentID)
            select (course, dept.Name) }
    |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
    

Aggiornamento del database

Per aggiornare il database, utilizzare le classi e i metodi di Entity Framework.È possibile utilizzare due tipi di contesti dati con il provider di tipo SQLEntityConnection.Innanzitutto, ServiceTypes.SimpleDataContextTypes.EntityContainer è il contesto dati semplificato, che include solo le proprietà specificate che rappresentano le tabelle e le colonne del database.In secondo luogo, il contesto dati completo è un'istanza della classe Entity Framework ObjectContext, che contiene il metodo AddObject per aggiungere righe al database.Entity Framework riconosce le tabelle e le relazioni tra loro, pertanto rafforza la coerenza tra database.

Per aggiornare il database

  1. Aggiungere il seguente codice al programma:In questo esempio, aggiungere due oggetti con una relazione tra loro e aggiungere un docente e l'assegnazione dell'ufficio.La tabella OfficeAssignments contiene la colonna InstructorID, che fa riferimento alla colonna PersonID nella tabella Person.

    // The full data context
    let fullContext = context.DataContext
    
    // A helper function.
    let nullable value = new System.Nullable<_>(value)
    
    let addInstructor(lastName, firstName, hireDate, office) =
        let hireDate = DateTime.Parse(hireDate)
        let newPerson = new EntityConnection.ServiceTypes.Person(LastName = lastName,
                                                    FirstName = firstName,
                                                    HireDate = nullable hireDate)
        fullContext.AddObject("People", newPerson)
        let newOffice = new EntityConnection.ServiceTypes.OfficeAssignment(Location = office)
        fullContext.AddObject("OfficeAssignments", newOffice)
        fullContext.CommandTimeout <- nullable 1000
        fullContext.SaveChanges() |> printfn "Saved changes: %d object(s) modified."
    
    addInstructor("Parker", "Darren", "1/1/1998", "41/3720")
    

    Non viene modificato niente nel database finché non viene chiamato SaveChanges.

  2. Ora ripristinare il database allo stato iniziale eliminando gli oggetti aggiunti.

    let deleteInstructor(lastName, firstName) =
            query {
                for person in context.People do
                where (person.FirstName = firstName &&
                        person.LastName = lastName)
                select person
            }
            |> Seq.iter (fun person->
                query {
                    for officeAssignment in context.OfficeAssignments do
                    where (officeAssignment.Person.PersonID = person.PersonID)
                    select officeAssignment }
                |> Seq.iter (fun officeAssignment -> fullContext.DeleteObject(officeAssignment))
    
                fullContext.DeleteObject(person))
    
            // The call to SaveChanges should be outside of any iteration on the queries.
            fullContext.SaveChanges() |> printfn "Saved changed: %d object(s) modified."
    
    deleteInstructor("Parker", "Darren")
    
    Nota di avvisoAttenzione

    Quando si utilizza un'espressione di query, è necessario ricordare che la query è soggetta alla valutazione differita.Pertanto, il database è ancora aperto per la lettura di tutte le valutazioni concatenate, come nei blocchi di espressione lambda dopo ogni espressione di query.Qualsiasi operazione di database che in modo esplicito o implicito utilizza una transazione deve avvenire dopo che le operazioni di lettura sono state completate.

Passaggi successivi

Esplorare altre opzioni query esaminando gli operatori di query disponibili in Espressioni di query (F#)e rivedere ADO.NET Entity Framework per comprendere le funzionalità disponibili quando si utilizza il provider di tipo.

Vedere anche

Attività

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

Riferimenti

Provider di tipo SqlEntityConnection (F#)

Altre risorse

Provider di tipi

ADO.NET Entity Framework

.edmx File Overview (Entity Framework)

Edm Generator (EdmGen.exe)