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
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í.
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.
Otevřete místní nabídku uzlu nového připojení a poté vyberte možnost Nový dotaz.
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#
Ukončete předchozí projekt, vytvořte nový projekt a zadejte název SchoolEDM.
V části Průzkumník řešení otevřete místní nabídku pro Odkazy a vyberte možnost Přidat odkaz.
Vyberte uzel Framework a poté v seznamu Framework vyberte sestavení System.Data, System.Data.Entity a System.Data.Linq.
Vyberte uzel Rozšíření, přidejte odkaz na sestavení FSharp.Data.TypeProviders a poté pomocí tlačítka OK dialogové okno zavřete.
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
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"
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
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).
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
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.
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")
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#)