Пошаговое руководство. Доступ к базе данных SQL с помощью поставщиков типов и сущностей (F#)
В этом пошаговом руководстве для F# 3.0 показывается, как получить доступ к типизированным данным для базы данных SQL на основе модели EDM ADO.NET. В нем также рассматриваются настройка поставщика типов SqlEntityConnection языка F# для использования с базой данных SQL, правила написания запросов к данным, вызов хранимых процедур в базе данных, а также использование некоторых типов и методов ADO.NET Entity Framework для обновления базы данных.
В этом пошаговом руководстве описываются перечисленные ниже задачи, которые необходимо выполнить в указанном порядке.
Создание базы данных School.
Создание и настройка проекта F#.
Настройка поставщика типов и подключение к модели EDM.
Запрос к базе данных.
Обновление базы данных
Обязательные компоненты
Необходимо иметь доступ к серверу с работающим программным обеспечением SQL Server, где можно создать базу данных для выполнения указанных ниже действий.
Создание базы данных School
Базу данных School можно создать на любом сервере с работающим программным обеспечением SQL Server, к которому имеется административный доступ. Можно также использовать LocalDB.
Действия для создания базы данных School
В разделе Обозреватель серверов откройте контекстное меню узла Подключения данных и выберите команду Добавить подключение.
Откроется диалоговое окно Добавить подключение.
В окне Имя сервера введите имя экземпляра SQL Server, к которому имеется административный доступ, или укажите (localdb\v11.0), если доступ к серверу отсутствует.
SQL Server Express LocalDB предоставляет упрощенный сервер базы данных для разработки и тестирования на компьютере. Дополнительные сведения о LocalDB см. в разделе Пошаговое руководство. Создание локального файла базы данных в Visual Studio.
В узле Подключения данных раздела Обозреватель серверов создается новый узел.
Откройте контекстное меню нового узла подключения и выберите пункт Новый запрос.
Откройте раздел Создание образца базы данных School на веб-сайте корпорации Майкрософт, а затем скопируйте и вставьте в окно редактора сценарий базы данных, который создает базу данных Student.
Создание и настройка проекта F#
На данном шаге создается проект и он настраивается на использование поставщика типов.
Действия для создания и настройки проекта F#
Закройте предыдущий проект, создайте другой проект и назовите его SchoolEDM.
В окне Обозреватель решений щелкните правой кнопкой мыши пункт Ссылки и выберите команду Добавить ссылку.
Выберите узел Платформа, а затем в списке Платформа выберите System.Data, System.Data.Entity и System.Data.Linq.
Выберите узел Расширения, добавьте ссылку на сборку FSharp.Data.TypeProviders, а затем нажмите кнопку ОК, чтобы закрыть диалоговое окно.
Добавьте представленный ниже код для определения внутреннего модуля и откройте соответствующие пространства имен. Поставщик типов может вводить типы только в закрытое или внутреннее пространство имен.
module internal SchoolEDM open System.Data.Linq open System.Data.Entity open Microsoft.FSharp.Data.TypeProviders
Чтобы запустить код в этом пошаговом руководстве в интерактивном режиме в виде скрипта, а не как компилированной программы, откройте контекстное меню узла проекта, выберите команду Добавить новый элемент, добавьте файл скрипта F#, а затем добавьте код на каждом шаге в скрипт. Для загрузки ссылок на сборку добавьте следующие строки.
#r "System.Data.Entity.dll" #r "FSharp.Data.TypeProviders.dll" #r "System.Data.Linq.dll"
Выделите каждый блок кода при его добавлении и нажмите клавиши Alt + ВВОД для запуска в F# Interactive.
Настройка поставщика типов и подключение к модели EDM
На этом шаге настраивается поставщик типов с подключением к данным и производится получение контекста данных, позволяющего работать с ними.
Действия для настройки поставщика типов и подключения к модели EDM
Введите представленный ниже код, чтобы настроить поставщик типов SqlEntityConnection, формирующий типы F# на основе ранее созданной модели EDM. Вместо полной строки подключения EDMX используйте только строку подключения SQL.
type private EntityConnection = SqlEntityConnection<ConnectionString="Server=SERVER\InstanceName;Initial Catalog=School;Integrated Security=SSPI;MultipleActiveResultSets=true", Pluralize = true> >
Это действие настраивает поставщик типов с созданным ранее подключением к базе данных. Свойство MultipleActiveResultSets необходимо при использовании ADO.NET Entity Framework, поскольку допускает асинхронное выполнение нескольких команд для базы данных в одном подключении. Такое может часто происходить в коде ADO.NET Entity Framework. Дополнительные сведения см. в разделе Использование режима MARS.
Получите контекст данных, который представляет собой объект, содержащий таблицы базы данных в качестве свойств и хранимые процедуры и функции базы данных в качестве методов.
let context = EntityConnection.GetDataContext()
Запрос к базе данных
На этом шаге используются выражения запросов F# для выполнения различных запросов к базе данных.
Действия для запроса данных
Введите представленный ниже код для запроса данных из модели EDM. Обратите внимание, что Pluralize = true изменяет таблицы базы данных Course на Courses и Person на 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)
Обновление базы данных
Для обновления базы данных можно использовать классы и методы Entity Framework. С поставщиком типов SQLEntityConnection можно использовать два типа контекста данных. Первый тип ServiceTypes.SimpleDataContextTypes.EntityContainer является упрощенным контекстом данных, который содержит только предоставленные свойства, представляющие таблицы и столбцы базы данных. Второй тип, полный контекст данных, — это экземпляр класса Entity Framework ObjectContext, содержащий метод AddObject для добавления строк в базу данных. Entity Framework распознает таблицы и отношения между ними, обеспечивая тем самым согласованность базы данных.
Обновление базы данных
Добавьте в программу представленный ниже код. В этом примере добавляются два объекта с отношением между ними, а также инструктор и распределение аудиторий. Таблица OfficeAssignments содержит столбец InstructorID, в котором имеется ссылка на столбец PersonID в таблице 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")
До вызова метода SaveChanges в базе данных ничего не изменяется.
Теперь восстановите предшествующее состояние базы данных, удалив добавленные объекты.
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")
Предупреждение
При использовании выражения запроса необходимо помнить, что такой запрос подвержен отложенным вычислениям.Поэтому база данных остается открытой для чтения при выполнении всех цепочек вычислений, например блоков лямбда-выражений после каждого выражения запроса.Любая операция базы данных, явно или неявно использующая транзакцию, должна произойти после завершения операций чтения.
Следующие действия
Просмотрите другие параметры запроса, изучив операторы запросов, представленные в разделе Выражения запросов (F#), а также прочтите раздел Платформа ADO.NET Entity Framework для выяснения функциональных возможностей, доступных при использовании данного поставщика типов.
См. также
Задачи
Пошаговое руководство. Создание типов F# из файла схемы EDMX (F#)
Ссылки
Поставщик типов SqlEntityConnection (F#)
Генератор модели EDM (EdmGen.exe)
Основные понятия
Платформа ADO.NET Entity Framework