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


Пошаговое руководство. Создание типов F# из файла схемы EDMX (F#)

В этом пошаговом руководстве для F# 3.0 показано создание типов для данных, представляемых моделью EDM, схема для которой определена в EDMX-файле. В этом пошаговом руководстве также описано использование поставщика типов EdmxFile. Сначала рассмотрим, не является ли поставщик типов SqlEntityConnection более подходящим поставщиком. Поставщик типов SqlEntityConnection оптимально подходит для сценариев, где имеется база данных реального времени, к которой можно подключаться на этапе разработки проекта, и у вас нет возражений против указания строки подключения во время компиляции. Однако этот поставщик типов предоставляет меньше функциональных возможностей базы данных по сравнению с поставщиком типов EdmxFile. Кроме того, при отсутствии подключения к базе данных реального времени для проекта базы данных, использующего модель EDM, можно использовать EDMX-файл, чтобы реализовать код для базы данных. При использовании поставщика типов EdmxFile компилятор F# выполняет программу EdmGen.exe для создания типов, которые он предоставляет.

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

  • Создание EDMX-файла

  • Создание проекта

  • Поиск или создание строки подключения модели EDM

  • Настройка поставщика типов

  • Запрос данных

  • Вызов хранимой процедуры

Создание EDMX-файла

Если EDMX-файл уже есть, этот шаг можно пропустить.

Создание EDMX-файла

  • При отсутствии EDMX-файла можно воспользоваться инструкциями, представленными в конце данного пошагового руководства в разделе Действия для настройки модели EDM.

Создание проекта

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

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

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

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

  3. В области Сборки выберите узел Платформа.

  4. В списке доступных сборок выберите сборки System.Data.Entity и System.Data.Linq, а затем нажмите кнопку Добавить, чтобы добавить ссылки на эти сборки в проект.

  5. В области Сборки выберите узел Расширения.

  6. В списке доступных расширений добавьте ссылку на сборку FSharp.Data.TypeProviders.

  7. Добавьте представленный ниже код, чтобы открыть соответствующие пространства имен.

    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    

Поиск или создание строки подключения для модели EDM

Строка подключения для модели EDM (строка подключения EDMX) содержит не только строку подключения для поставщика базы данных, но и дополнительные сведения. Например, строка подключения EDMX для простой базы данных SQL Server подобна следующему коду.

let edmConnectionString = "metadata=res://*/;provider=System.Data.SqlClient;Provider Connection String='Server=SERVER\Instance;Initial Catalog=DatabaseName;Integrated Security=SSPI;'"

Дополнительные сведения о строках подключения EDMX см. в разделе Строки соединения.

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

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

    open System
    open System.Data
    open System.Data.SqlClient
    open System.Data.EntityClient
    open System.Data.Metadata.Edm
    
    let getEDMConnectionString(dbConnectionString) =
        let dbConnection = new SqlConnection(connectionString)
        let resourceArray = [| "res://*/" |]
        let assemblyList = [| System.Reflection.Assembly.GetCallingAssembly() |]
        let metaData = MetadataWorkspace(resourceArray, assemblyList)
        new EntityConnection(metaData, dbConnection)
    

Настройка поставщика типов

На этом шаге создается и настраивается поставщик типов со строкой подключения EDMX, а также создаются типы для схемы, определенной в EMDX-файле.

Настройка поставщика типов и создание типов

  1. Скопируйте EDMX-файл, созданный на первом шаге данного пошагового руководства, в папку проекта.

  2. Откройте контекстное меню узла проекта в проекте F#, выберите команду Добавить существующий элемент, а затем выберите EDMX-файл, чтобы добавить его в проект.

  3. Введите представленный ниже код, чтобы активировать поставщик типов для EDMX-файла. Замените Server\Instance именем сервера, на котором работает SQL Server, и именем экземпляра, а затем используйте имя EDMX-файла из первого шага данного пошагового руководства.

    type edmx = EdmxFile<"Model1.edmx", ResolutionFolder = @"<folder that contains your .edmx file>>
    
    let edmConnectionString =
        getEDMConnectionString("Data Source=SERVER\instance;Initial Catalog=School;Integrated Security=true;")
    let context = new edmx.SchoolModel.SchoolEntities(edmConnectionString)
    

Запрос данных

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

Действия для запроса данных

  • Введите представленный ниже код, чтобы запросить данные в модели EDM.

    query { for course in context.Courses do
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    query { for person in context.Person 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 (for dept in context.Departments -> course.DepartmentID = dept.DepartmentID)
            select (course, dept.Name) }
    |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
    

Вызов хранимой процедуры

Хранимые процедуры можно вызывать с помощью поставщика типов EDMX. В следующей процедуре база данных School содержит хранимую процедуру UpdatePerson, которая обновляет запись, используя новые значения столбцов. Эту хранимую процедуру можно использовать, поскольку она предоставляется в качестве метода типа DataContext.

Действия для вызова хранимой процедуры

  • Добавьте к записям обновления следующий код.

    // Call a stored procedure.
    let nullable value = new System.Nullable<_>(value)
    
    // Assume now that you must correct someone's hire date.
    // Throw an exception if more than one matching person is found.
    let changeHireDate(lastName, firstName, hireDate) =
    
        query { for person in context.People do
                where (person.LastName = lastName &&
                       person.FirstName = firstName)
                exactlyOne }
        |> (fun person ->
                context.UpdatePerson(nullable person.PersonID, person.LastName,
                    person.FirstName, nullable hireDate, person.EnrollmentDate))
    
    changeHireDate("Abercrombie", "Kim", DateTime.Parse("1/12/1998"))
    |> printfn "Result: %d"
    

    В случае успеха результатом будет значение 1. Обратите внимание, что exactlyOne используется в выражении запроса, чтобы обеспечить возврат только одного результата; в противном случае создается исключение. Для упрощения работы со значениями null можно использовать определенную в этом коде простую функцию nullable, чтобы из обычного значения создать значение, допускающее значение null.

Настройка модели EDM

Эту процедуру следует выполнить, только если необходимо знать, как создать полную модель EDM из базы данных при отсутствии базы данных для тестирования.

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

  1. В строке меню выберите SQL-код, Редактор Transact-SQL, Создать запрос, чтобы создать базу данных. В случае получения запроса укажите сервер и экземпляр базы данных.

  2. Скопируйте и вставьте содержимое скрипта базы данных, который создает базу данных учащихся, согласно описанию в документации по Entity Framework, представленной в центре разработки данных.

  3. Запустите скрипт SQL, щелкнув кнопку панели инструментов с символом треугольника или нажав сочетание клавиш Ctrl+Q.

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

  5. Создайте проект консольного приложения C# или Visual Basic, откройте его контекстное меню, выберите команду Добавить новый элемент, а затем выберите Модель EDM ADO.NET.

    Откроется мастер моделей EDM. С помощью этого мастера можно выбрать способ создания модели EDM.

  6. В разделе Выбор содержимого модели установите флажок Создать из базы данных.

  7. На следующей странице выберите только что созданную базу данных School в качестве подключения к данным.

    Это подключение должно быть подобно <servername>.<instancename>.School.dbo.

  8. Скопируйте строку подключения сущности в буфер обмена, поскольку эта строка может пригодиться в будущем.

  9. Убедитесь, что установлен флажок для записи строки подключения сущности в файл App.Config, и сделайте заметку в виде строкового значения в текстовом поле, которая поможет найти строку подключения позже (при необходимости).

  10. На следующей странице выберите Таблицы и Хранимые процедуры и функции.

    При выборе этих узлов верхнего уровня выбираются все таблицы, хранимые процедуры и функции. При необходимости можно также выбрать их отдельно.

  11. Убедитесь, что установлены флажки для других параметров.

    Первый флажок Формировать имена объектов во множественном или единственном числе указывает, следует ли изменять формы в единственном числе на формы во множественном числе для обеспечения соответствия соглашениям по именованию объектов, представляющих таблицы базы данных. Флажок Включить столбцы внешних ключей в модель указывает, следует ли включать поля, назначение которых — соединение с другими полями в типах объектов, созданных для схемы базы данных. Третий флажок указывает, следует ли включать в модель хранимые процедуры и функции.

  12. Нажмите кнопку Готово для создания EMDX-файла, содержащего модель EDM на основе базы данных School.

    Файл Model1.edmx добавляется в проект, и появляется диаграмма базы данных.

  13. В строке меню выберите Вид, Другие окна, Браузер моделей EDM для просмотра всех сведений о модели или Сведения о сопоставлении модели EDM, чтобы открыть окно с информацией о том, как созданная модель объектов сопоставляется таблицам и столбцам базы данных.

Следующие действия

Изучите другие запросы, просмотрев доступные операторы запросов, перечисленные в разделе Выражения запросов (F#).

См. также

Задачи

Пошаговое руководство. Доступ к базе данных SQL с помощью поставщиков типов и сущностей (F#)

Ссылки

Поставщик типов EdmxFile (F#)

Генератор модели EDM (EdmGen.exe)

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

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

Entity Framework

.edmx File Overview (Entity Framework)