Názorný postup: Přístup K databázi SQL pomocí zprostředkovatelů typu a subjekty (F#)

Tento návod pro jazyk F# 3.0 popisuje přístup k typovým datům databáze SQL na základě modelu ADO.NET Entity Data Model.Tento návod popisuje, jak nastavit poskytovatele typu SqlEntityConnection jazyka F# pro použití s databází SQL, jak psát dotazy vůči datům, jak v databázi volat uložené procedury i některé typy rozhraní ADO.NET Entity Framework a metody pro aktualizaci databáze.

Tento návod popisuje následující úkoly, které je zapotřebí pro správnou činnost provést v uvedeném pořadí:

  • Vytvoření databáze školy .

  • Vytvoření a konfigurace projektu jazyka F# .

  • Konfigurace poskytovatele typu a připojení k modelu Entity Data Model .

  • Dotazování na databázi .

  • Aktualizace databáze

Požadavky

K dokončení těchto kroků je nutné mít přístup k systému SQL Server, kde můžete vytvořit databázi.

Vytvoření databáze školy

Databázi školy můžete vytvořit na libovolném serveru, kde je spuštěn systém SQL Server, na kterém máte přístup správce nebo pomocí databáze LocalDB.

Chcete-li vytvořit databázi školy

  1. V podokně Průzkumníku serveru otevřete místní nabídku uzlu Datová připojení a poté zvolte Přidat připojení.

    Zobrazí se dialogové okno Přidat připojení.

  2. Do pole Název serveru zadejte název instance systému SQL Server, ke kterému máte přístup správce nebo zadejte (localdb\v11.0) pokud nemáte přístup k serveru.

    Databáze SQL Server Express LocalDB poskytuje lehký databázový server pro vývoj a testování v počítači.Další informace o databázi LocalDB naleznete v tématu Postupy: Vytvoření databáze LocalDB.

    V podokně Průzkumník serveru je pod uzlem Datová připojení vytvořen nový uzel.

  3. Otevřete místní nabídku uzlu nového připojení a poté zvolte Nový dotaz.

  4. Otevřete odkaz Creating the School Sample Database na webu společnosti Microsoft a poté zkopírujte a do okna editoru vložte skript databáze, který vytvoří databázi Student.

    Další kroky v tomto návodu jsou založeny na následujícím výukovém programu: ADO.NET Entity Data Model Quickstart.

Vytvoření a konfigurace projektu jazyka F#

V tomto kroku vytvoříte projekt a nastavíte jej pro použití poskytovatele typu.

Chcete-li vytvořit a konfigurovat projekt jazyka F#

  1. Uzavřete předchozí projekt, vytvořte nový projekt a pojmenujte jej SchoolEDM.

  2. V Průzkumníkovi řešení otevřete místní nabídku pro Odkazy a zvolte Přidat odkaz.

  3. Vyberte uzel Framework a poté v seznamu Framework vyberte sestavení System.Data, System.Data.Entity a System.Data.Linq.

  4. Vyberte uzel Rozšíření, přidejte odkaz na sestavení FSharp.Data.TypeProviders a stisknutím tlačítka OK zavřete dialogové okno.

  5. Pro definování vnitřního modulu a otevření příslušných oborů názvů přidejte následující kód.Poskytovatel typu může vložit typy pouze do soukromého nebo interního oboru názvů.

    module internal SchoolEDM
    
    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    
  6. Chcete-li kód v tomto návodu spustit interaktivně jako skript namísto zkompilovaného programu, otevřete místní nabídku uzlu projektu, zvolte Přidat novou položku, přidejte soubor skriptu jazyka F# a poté přidejte kód každého kroku do skriptu.Chcete-li načíst odkazy na sestavení, přidejte následující řádky.

    #r "System.Data.Entity.dll"
    #r "FSharp.Data.TypeProviders.dll"
    #r "System.Data.Linq.dll"
    
  7. Jakmile přidáte každý blok kódu zvýrazněte jej a stiskněte klávesovou zkratku Alt + Enter, abyste kód spustili pomocí komponenty F# Interactive.

Konfigurace poskytovatele typu a připojení k modelu Entity Data Model

V tomto kroku nastavíte poskytovatele typu s datovým připojením a získáte kontext dat, který umožňuje práci s daty.

Chcete-li nakonfigurovat poskytovatele typu a připojení k modelu Entity Data Model

  1. Chcete-li nakonfigurovat poskytovatele typu SqlEntityConnection, zadejte následující kód, který vygeneruje typy jazyka F# v závislosti na modelu Entity Data Model vytvořeném dříve.Namísto úplného připojovacího řetězce modelu EDMX použijte pouze připojovací řetězec databáze SQL.

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

    Tato akce nastaví poskytovatele typu s připojením k databázi, které jste vytvořili dříve.Vlastnost MultipleActiveResultSets je nutná při použití rozhraní ADO.NET Entity Framework, protože umožňuje v databázi spustit asynchronně více příkazů pomocí jednoho připojení, což může v kódu rozhraní ADO.NET Entity Framework nastat často.Další informace naleznete v tématu Multiple Active Result Sets (MARS).

  2. Získáte kontext dat, což je objekt obsahující tabulky databáze jako vlastnosti a uložené procedury a funkce databáze jako metody.

    let context = EntityConnection.GetDataContext()
    

Dotazování na databázi

V tomto kroku použijete výrazy dotazu jazyka F# ke spuštění různých dotazů v databázi.

Dotazování na data

  • Pro dotaz na data z modelu Entity Data Model zadejte následující kód.Poznamenejme efekt kódu Pluralize = true, který změní tabulky databáze Course na Courses a Person na Persons.

    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)
    

Aktualizace databáze

Chcete-li aktualizovat databázi, použijte třídy a metody rozhraní Entity Framework.Poskytovatel typu SQLEntityConnection může používat dva typy kontextu dat.První kontext dat ServiceTypes.SimpleDataContextTypes.EntityContainer je zjednodušený kontext dat, který obsahuje pouze vlastnosti, které představují databázové tabulky a sloupce.Druhý, úplný kontext dat je instancí třídy ObjectContext rozhraní Entity Framework, která obsahuje metodu AddObject pro přidání řádků do databáze.Rozhraní Entity Framework rozpoznává tabulky a vztahy mezi nimi a tak zajišťuje konzistenci databáze.

Chcete-li aktualizovat databázi

  1. Do programu přidejte následující kód.V tomto příkladu přidáte dva objekty se vztahem mezi nimi a přidáte instruktora a přiřazení kanceláře.Tabulka OfficeAssignments obsahuje sloupec InstructorID, který odkazuje na sloupec PersonID v tabulce 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")
    

    V databázi se nic nezmění, dokud nezavoláte metodu SaveChanges.

  2. Nyní databázi obnovte do předchozího stavu odstraněním objektů, které jste přidali.

    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")
    
    Poznámka k upozorněníUpozornění

    Při použití výrazu dotazu je nutné si pamatovat, že dotaz je vyhodnocen opožděně.Databáze je tedy stále otevřena pro čtení během jakýchkoliv zřetězených vyhodnocení jako v blocích výrazu lambda po každém výrazu dotazu.Všechny operace databáze, která explicitně nebo implicitně používají transakce musí nastat po dokončení operací čtení.

Další kroky

Další možnosti dotazu naleznete v tématu Výrazy dotazu (F#). Další funkce dostupné při použití poskytovatele typu naleznete v tématu ADO.NET Entity Framework.

Viz také

Úkoly

Názorný postup: Generování typy F# ze souboru schématu EDMX (F#)

Referenční dokumentace

Zprostředkovatel SqlEntityConnection typu (F#)

Další zdroje

Typ zprostředkovatele

ADO.NET Entity Framework

.edmx File Overview (Entity Framework)

Edm Generator (EdmGen.exe)