Sdílet prostřednictvím


Návod: Přístup k databázi SQL s použitím zprostředkovatelů typů a entit (F#)

Tento návod pro jazyk F# 3.0 popisuje možnosti přístupu k typovým datům databáze SQL na základě datového modelu entity ADO.NET.Tento návod popisuje způsob nastavení poskytovatele typu SqlEntityConnection jazyka F# pro použití s databází SQL, psaní dotazů vůči datům, volání uložených procedur a také používání některých typů rozhraní ADO.NET Entity Framework a metod pro aktualizaci databáze.

Tento návod znázorňuje následující úkoly, které je nutné z důvodu správné funkčnosti provést v tomto pořadí:

  • Vytvoření databáze školy.

  • Vytvoření a konfigurace projektu v jazyce 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 vyžadován přístup k systému SQL Server, kde můžete databázi vytvořit.

Vytvoření databáze školy

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

Postup vytvoření databáze školy

  1. V části Průzkumník serveru otevřete místní nabídku uzlu Datová připojení a poté vyberte možnost 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. Pokud nemáte přístup k serveru, zadejte parametr (localdb\v11.0).

    Databáze SQL Server Express LocalDB poskytuje jednoduchý databázový server pro vývoj a testování na vašem počítači.Další informace o databázi LocalDB naleznete v tématu Návod: Vytvoření lokálního databázového souboru v sadě Visual Studio.

    V nabídce Datová připojení v části Průzkumník serveru je vytvořen nový uzel.

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

  4. Otevřete odkaz Vytvoření ukázkové databáze školy na webu společnosti Microsoft a poté zkopírujte a vložte do okna skript databáze, který vytvoří databázi Student.

Vytvoření a konfigurace projektu v jazyce F#

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

Postup vytvoření a konfigurace projektu jazyka F#

  1. Ukončete předchozí projekt, vytvořte nový projekt a zadejte název SchoolEDM.

  2. V části Průzkumník řešení otevřete místní nabídku pro Odkazy a vyberte možnost 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 poté pomocí tlačítka OK dialogové okno zavřete.

  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, nikoli jako zkompilovaný program, otevřete místní nabídku uzlu projektu, vyberte příkaz Přidat novou položku, přidejte soubor skriptu jazyka F# a poté přidejte kód v každém 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í součásti F# Interactive.

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

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

Postup konfigurace 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, který byl vytvořen 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 pomocí připojení k databázi, které jste vytvořili dříve.Vlastnost MultipleActiveResultSets je vyžadována tehdy, pokud použijete rozhraní ADO.NET Entity Framework, protože umožňuje v databázi spustit asynchronně více příkazů pomocí jednoho připojení, k čemuž může v kódu rozhraní ADO.NET Entity Framework docházet často.Další informace naleznete v tématu Více aktivních sad výsledků (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.

Postup dotazování na data

  • Chcete-li zadat dotaz na data z modelu Entity Data Model, použijte následující kód.Pamatujte, že parametr Pluralize má hodnotu true, čímž dojde ke změně tabulky databáze z položky Kurz na položku Kurzy a z položky Osoba na položku Lidé.

    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 databázi aktualizovat, 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í tabulky a sloupce databáze.Druhý, úplný kontext dat je instancí třídy ObjectContext rozhraní Entity Framework, která obsahuje metodu AddObject pro přidávání řádků do databáze.Rozhraní Entity Framework rozpoznává tabulky a vztahy mezi nimi, čímž zajišťuje konzistenci databáze.

Postup aktualizace databáze

  1. Do programu přidejte následující kód.V tomto příkladu přidáte dva objekty se vztahem mezi nimi a poté přidáte školitele 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 nedojde k žádné změ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í

    Pokud použijete výraz 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 například v blocích výrazu lambda po každém výrazu dotazu.Všechny operace databáze, které explicitně nebo implicitně používají transakci, musí být provedeny po dokončení operací čtení.

Další kroky

Další možnosti dotazu naleznete v tématu Výrazy dotazu (F#). Chcete-li se seznámit s funkcemi, které jsou k dispozici při používání tohoto poskytovatele typu, přečtěte si dokument ADO.NET Entity Framework.

Viz také

Úkoly

Návod: Generování typů F# ze souboru schématu EDMX (F#)

Referenční dokumentace

SqlEntityConnection – poskytovatel typů (F#)

EDM Generator (EdmGen.exe)

Koncepty

ADO.NET Entity Framework

Další zdroje

Zprostředkovatelé typů

.edmx File Overview (Entity Framework)