Поделиться через


Пошаговое руководство. Доступ к базе данных 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

  1. В разделе Обозреватель серверов откройте контекстное меню узла Подключения данных и выберите команду Добавить подключение.

    Откроется диалоговое окно Добавить подключение.

  2. В окне Имя сервера введите имя экземпляра SQL Server, к которому имеется административный доступ, или укажите (localdb\v11.0), если доступ к серверу отсутствует.

    SQL Server Express LocalDB предоставляет упрощенный сервер базы данных для разработки и тестирования на компьютере. Дополнительные сведения о LocalDB см. в разделе Пошаговое руководство. Создание локального файла базы данных в Visual Studio.

    В узле Подключения данных раздела Обозреватель серверов создается новый узел.

  3. Откройте контекстное меню нового узла подключения и выберите пункт Новый запрос.

  4. Откройте раздел Создание образца базы данных School на веб-сайте корпорации Майкрософт, а затем скопируйте и вставьте в окно редактора сценарий базы данных, который создает базу данных Student.

Создание и настройка проекта F#

На данном шаге создается проект и он настраивается на использование поставщика типов.

Действия для создания и настройки проекта F#

  1. Закройте предыдущий проект, создайте другой проект и назовите его SchoolEDM.

  2. В окне Обозреватель решений щелкните правой кнопкой мыши пункт Ссылки и выберите команду Добавить ссылку.

  3. Выберите узел Платформа, а затем в списке Платформа выберите System.Data, System.Data.Entity и System.Data.Linq.

  4. Выберите узел Расширения, добавьте ссылку на сборку FSharp.Data.TypeProviders, а затем нажмите кнопку ОК, чтобы закрыть диалоговое окно.

  5. Добавьте представленный ниже код для определения внутреннего модуля и откройте соответствующие пространства имен. Поставщик типов может вводить типы только в закрытое или внутреннее пространство имен.

    module internal SchoolEDM
    
    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    
  6. Чтобы запустить код в этом пошаговом руководстве в интерактивном режиме в виде скрипта, а не как компилированной программы, откройте контекстное меню узла проекта, выберите команду Добавить новый элемент, добавьте файл скрипта F#, а затем добавьте код на каждом шаге в скрипт. Для загрузки ссылок на сборку добавьте следующие строки.

    #r "System.Data.Entity.dll"
    #r "FSharp.Data.TypeProviders.dll"
    #r "System.Data.Linq.dll"
    
  7. Выделите каждый блок кода при его добавлении и нажмите клавиши Alt + ВВОД для запуска в F# Interactive.

Настройка поставщика типов и подключение к модели EDM

На этом шаге настраивается поставщик типов с подключением к данным и производится получение контекста данных, позволяющего работать с ними.

Действия для настройки поставщика типов и подключения к модели EDM

  1. Введите представленный ниже код, чтобы настроить поставщик типов 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.

  2. Получите контекст данных, который представляет собой объект, содержащий таблицы базы данных в качестве свойств и хранимые процедуры и функции базы данных в качестве методов.

    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 распознает таблицы и отношения между ними, обеспечивая тем самым согласованность базы данных.

Обновление базы данных

  1. Добавьте в программу представленный ниже код. В этом примере добавляются два объекта с отношением между ними, а также инструктор и распределение аудиторий. Таблица 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 в базе данных ничего не изменяется.

  2. Теперь восстановите предшествующее состояние базы данных, удалив добавленные объекты.

    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

Другие ресурсы

Поставщики типов

.edmx File Overview (Entity Framework)