1. Главная страница » Компьютеры

Entity framework создание базы данных

Автор: | 16.12.2019

Ранее мы уже видели, как Entity Framework создает базу данных из сущностной модели с помощью Code-First, но при этом не описывали этот момент более подробно. С помощью Code-First можно настроить инициализацию базы данных. Например, в статье “Использование Code-First” мы использовали следующие настройку:

Этот код говорит Code-First, что если модель данных изменилась, то нужно удалить и воссоздать базу данных с новой моделью.

Процесс инициализации базы данных состоит из двух этапов:

Во-первых, Code-First создает объектную модель в памяти, используя соглашения и настройки конфигурации, которые мы описывали ранее.

Во-вторых, база данных, которая будет использоваться для хранения данных, создается с использованием инициализатора базы данных, который был установлен (как показано в примере выше).

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

Запуск инициализации базы данных вручную

Есть ситуации, когда вы, возможно, захотите контролировать момент создания базы данных, а не использовать автоматическую инициализацию Code-First. Для явного вызова процесса создания базы данных используется метод DbContext.Database. Initialize(), которому передается логический параметр. Если этот логический параметр равен false, то инициализация запустится только в том случае, если она уже не была вызвана ранее. Если этот логический параметр равен true, инициализация запустится в любом случае. Стоит запомнить, что этот метод следует вызвать до создания объекта контекста, его, например, можно указать в конструкторе класса контекста.

Читайте также:  Hspa locker как пользоваться

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

Давайте рассмотрим пример использования ручной инициализации. Мы будем использовать старую модель, с двумя классами Customer и Order, которую использовали ранее. Следующий код можно добавить в обработчик загрузки веб-формы нашего приложения ASP.NET:

Давайте теперь создадим ошибку в нашей модели. Для этого первичному ключу CustomerId класса Customer явно зададим тип NVARCHAR в базе данных с помощью атрибута Column. Это вызовет ошибку инициализации модели, т.к. поле имеет тип int:

В результате запуска приложения с такой моделью, в окне отладки Output вы увидите следующее сообщение с ошибкой:

Как вы видите, с помощью ручной инициализации мы можем обработать ошибки, возникающие при отображении модели на базу данных. В данном случае мы просто вывели сообщение в консоль, но в реальном приложении вы можете предпринять какие-нибудь действия и попробовать повторно инициализировать базу данных. Удалите атрибут Column у свойства CustomerId в классе модели, чтобы тестировать последующие примеры.

С помощью метода Initialize() можно также отключить автоматическую инициализацию базы данных. Для этого вы можете передать ему значение null, при этом все еще можно будет запустить инициализацию вручную.

Создание базы данных в зависимости от условия

С помощью метода Database.SetInitializer() можно управлять поведением Code-First для создания базы данных при изменении модели. Этот метод принимает экземпляр интерфейса IDatabaseInitializer . В Entity Framework есть три класса, реализующих этот интерфейс и обеспечивающих возможность выбора поведения Code-First при инициализации базы данных:

CreateDatabaseIfNotExists

Экземпляр этого класса используется в Code-First по умолчанию для всех классов контекста. Это безопасный способ инициализации, при котором база данных никогда не будет удалена и данные не будут потеряны. При этом способе инициализации, база данных создается только один раз, когда ее еще не существует. Если модель данных была изменена, например мы добавили новый класс, то Entity Framework обнаружит эти изменения (с помощью таблицы __MigrationHistory) и возбудит исключение, т.к. при таком типе инициализации нельзя удалить базу данных, а соответственно нельзя отразить на нее новую модель.

DropCreateDatabaseIfModelChanges

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

DropCreateDatabaseAlways

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

Помимо этих стандартных типов инициализации вы можете создать произвольный тип инициализации, реализовав интерфейс >метод InitializeDatabase() принимающий объект контекста. Примером пользовательского механизма инициализации может послужить класс DontDropDbJustCreateTablesIfModelChanged, который находится в расширении EF CodeFirst пакета NuGet. С помощью этого инициализатора вы можете не беспокоится об удалении базы данных, т.к. он затрагивает только таблицы, которые изменились в модели.

Установить инициализатор, используемый по умолчанию, можно также в конфигурационном файле приложения, как показано в примере ниже:

Для этого используется раздел contexts настроек Entity Framework. При структуре этого приложения эти настройки нужно указывать в файле Web.config веб-приложения, а не в проекте, где мы создавали модель. Обратите внимание, что в этом примере показано использование атрибута disableDatabaseInitialization. Если вы установите его в true, то сможете отключить автоматическую инициализацию базы данных в приложении, как мы делали это с использованием метода Initialize(null). В атрибуте type узла context указывается полное имя класса контекста, а также имя сборки, где содержится этот класс. В атрибуте type узла databaseInitializer указывается полный тип инициализатора, обратите внимание на синтаксис этой инструкции.

Создание базы данных с некоторыми данными по умолчанию

Ранее в этой статье вы видели как и когда создается база данных в Code-First и как этим процессом можно управлять. При этом создаваемая база данных всегда пуста, хотя возможны ситуации, когда вы захотите вставить некоторые начальные данные при создании базы. Например, вы можете добавить некоторые справочные таблицы, которые содержат статичную информацию — список стран, валют, список областей и населенных пунктов Российской Федерации и т.п.

Для этого вы можете использовать свой инициализатор данных, унаследованный от одного из стандартных инициализаторов и переопределить его метод Seed(). Допустим вам нужно добавить таблицу, со всеми крупными населенными пунктами России, чтобы можно было привязать адрес проживания покупателя в модели. Для этого давайте определим следующую модель:

В таблице City мы будем хранить список городов. Чтобы заполнить эту таблицу автоматически при инициализации базы данных, можно использовать следующий код:

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

Добавление настроек базы данных при ее инициализации

Помимо добавления данных по умолчанию, в базе данных можно определить и другие настройки, которые будут применены при инициализации. Например, вы можете создать индекс для столбца FirstName таблицы Customers, чтобы ускорить поиск по имени покупателя в этой таблице. Чтобы определить различные настройки, вы можете использовать метод DbContext.Database.ExecuteSqlCommand(), в который передается произвольная SQL-команда для настройки различных аспектов базы данных. Этот метод вызывается также, в переопределенном методе Seed() объекта инициализации. В следующем примере показано, как задать индекс для столбца CustomerId:

Очевидно, что с помощью этого метода вы можете выполнить любую SQL-команду для настройки базы данных. На рисунке ниже показан добавленный в таблицу индекс:

Для разработки новых приложений мы рекомендуем ASP.NET Core Razor Pages по ASP.NET MVC контроллеры и представления. For new development, we recommend ASP.NET Core Razor Pages over ASP.NET MVC controllers and views. Для следующего вида серии руководств см. в разделе с помощью Razor Pages, руководства: Начало работы с Razor Pages в ASP.NET Core. For a tutorial series similar to this one using Razor Pages, see Tutorial: Get started with Razor Pages in ASP.NET Core. Новый учебник. The new tutorial:

  • проще для выполнения; Is easier to follow.
  • содержит больше рекомендаций по EF Core; Provides more EF Core best practices.
  • использует более эффективные запросы; Uses more efficient queries.
  • более актуально, так как используются новейшие API; Is more current with the latest API.
  • охватывает дополнительные возможности; Covers more features.
  • является предпочтительным подходом для разработки новых приложений. Is the preferred approach for new application development.

В этой серии руководств вы узнаете, как создать приложение ASP.NET MVC 5, использующий Entity Framework 6 для доступа к данным. In this series of tutorials, you learn how to build an ASP.NET MVC 5 application that uses Entity Framework 6 for data access. В этом учебнике используется Code First рабочего процесса. This tutorial uses the Code First workflow. Сведения о том, как выбрать Code First, Database First или Model First, см. в разделе создать модель. For information about how to choose between Code First, Database First, and Model First, see Create a model.

В этой серии руководств описывается построение примера приложения университета Contoso. This tutorial series explains how to build the Contoso University sample application. Пример приложения веб-сайт простой университета. The sample application is a simple university website. С ним вы можете просматривать и обновлять учащихся, курсах и сведения о преподавателе. With it, you can view and update student, course, and instructor information. Ниже приведены два созданных экранов. Here are two of the screens you create:

В этом учебнике рассмотрены следующие задачи. In this tutorial, you:

  • Создать веб-приложение MVC Create an MVC web app
  • Настройка стиля сайта Set up the site style
  • Установка Entity Framework 6 Install Entity Framework 6
  • Создание модели данных Create the data model
  • Создание контекста базы данных Create the database context
  • Инициализация базы данных с тестовыми данными Initialize DB with test data
  • Настройка EF 6 для использования LocalDB Set up EF 6 to use LocalDB
  • Создание контроллера и представлений Create controller and views
  • Просмотр базы данных View the database

Предварительные требования Prerequisites

Создать веб-приложение MVC Create an MVC web app

Откройте Visual Studio и создайте C# веб-проекта с помощью веб-приложение ASP.NET (.NET Framework) шаблона. Open Visual Studio and create a C# web project using the ASP.NET Web Application (.NET Framework) template. Назовите проект ContosoUniversity и выберите ОК. Name the project ContosoUniversity and select OK.

В новый веб-приложение ASP.NET — ContosoUniversityвыберите MVC. In New ASP.NET Web Application — ContosoUniversity, select MVC.

По умолчанию проверки подлинности параметру присваивается без проверки подлинности. By default, the Authentication option is set to No Authentication. В этом учебнике веб-приложение не требует пользователи выполняли вход. For this tutorial, the web app doesn’t require users to sign in. Кроме того он не ограничивает доступ, в зависимости от того, кто выполнил вход. Also, it doesn’t restrict access based on who’s signed in.

Нажмите кнопку ОК, чтобы создать проект. Select OK to create the project.

Настройка стиля сайта Set up the site style

Выполните незначительную настройку меню, макета и домашней страницы сайта. A few simple changes will set up the site menu, layout, and home page.

Откройте ViewsShared\_Layout.cshtmlи внесите следующие изменения: Open ViewsShared\_Layout.cshtml, and make the following changes:

  • Замените все вхождения «My ASP.NET Application» и «Имя приложения» на «Contoso University». Change each occurrence of "My ASP.NET Application" and "Application name" to "Contoso University".
  • Добавление пунктов меню для учащихся, курсов, преподавателей и отделов и удалите запись контакта. Add menu entries for Students, Courses, Instructors, and Departments, and delete the Contact entry.

Изменения выделены в следующем фрагменте кода: The changes are highlighted in the following code snippet:

В ViewsHomeIndex.cshtml, замените содержимое файла следующим кодом, который заменяет текст о ASP.NET и MVC об этом приложении: In ViewsHomeIndex.cshtml, replace the contents of the file with the following code to replace the text about ASP.NET and MVC with text about this application:

Нажмите клавиши Ctrl + F5 для запуска веб-сайта. Press Ctrl+F5 to run the web site. Появится домашняя страница с меню. You see the home page with the main menu.

Установка Entity Framework 6 Install Entity Framework 6

Из средства меню, выберите диспетчер пакетов NuGet, а затем выберите консоль диспетчера пакетов. From the Tools menu, choose NuGet Package Manager, and then choose Package Manager Console.

В консоль диспетчера пакетов окно, введите следующую команду: In the Package Manager Console window, enter the following command:

Этот шаг является одним из нескольких шагов с учебником можно сделать вручную, но, могло быть сделано автоматически с помощью функции формирования шаблонов ASP.NET MVC. This step is one of a few steps that this tutorial has you do manually, but that could have been done automatically by the ASP.NET MVC scaffolding feature. Вы выполняете их вручную, чтобы вы могли видеть шаги, необходимые для использования Entity Framework (EF). You’re doing them manually so that you can see the steps required to use Entity Framework (EF). Вы воспользуетесь формирования шаблонов позже для создания контроллера и представлений MVC. You’ll use scaffolding later to create the MVC controller and views. Альтернативным вариантом является для формирования шаблонов автоматически установить пакет EF NuGet создать класс контекста базы данных и создания строки подключения. An alternative is to let scaffolding automatically install the EF NuGet package, create the database context class, and create the connection string. Когда вы будете готовы сделать это таким образом, что необходимо сделать всего лишь пропустить эти шаги и сформировать шаблон контроллера MVC после создания классов сущностей. When you’re ready to do it that way, all you have to do is skip those steps and scaffold your MVC controller after you create your entity classes.

Создание модели данных Create the data model

Теперь необходимо создать классы сущностей для приложения университета Contoso. Next you’ll create entity classes for the Contoso University application. Сначала вы возьмете следующих трех сущностей: You’ll start with the following three entities:

Курс регистрации учащегося Course Enrollment Student

Сущности Entities Relationship Relationship
Курс для регистрации Course to Enrollment один ко многим One-to-many
Учащегося для регистрации Student to Enrollment один ко многим One-to-many

Между сущностями Student и Enrollment , а также между сущностями Course и Enrollment существует отношение "один ко многим". There’s a one-to-many relationship between Student and Enrollment entities, and there’s a one-to-many relationship between Course and Enrollment entities. Другими словами, учащийся может быть зарегистрирован в любом количестве курсов, а в отдельном курсе может быть зарегистрировано любое количество учащихся. In other words, a student can be enrolled in any number of courses, and a course can have any number of students enrolled in it.

В следующих разделах вы создадите класс для каждого из этих сущностей. In the following sections, you’ll create a class for each one of these entities.

При попытке компиляции проекта до завершения создания всех этих классов сущностей, вы получите ошибки компилятора. If you try to compile the project before you finish creating all of these entity classes, you’ll get compiler errors.

Сущность Student The Student entity

В моделей папке создайте файл класса с именем Student.cs щелкнув правой кнопкой папку, в обозревателе решений и выбрав добавить > Класс. In the Models folder, create a class file named Student.cs by right-clicking on the folder in Solution Explorer and choosing Add > Class. Замените код шаблона следующим кодом: Replace the template code with the following code:

Свойство ID будет использоваться в качестве столбца первичного ключа в таблице базы данных, соответствующей этому классу. The ID property will become the primary key column of the database table that corresponds to this class. По умолчанию Entity Framework интерпретирует свойство с именем ID или classname ID как первичный ключ. By default, Entity Framework interprets a property that’s named ID or classname ID as the primary key.

Свойство Enrollments является свойством навигации. The Enrollments property is a navigation property. Свойства навигации содержат другие сущности, связанные с этой сущностью. Navigation properties hold other entities that are related to this entity. В этом случае Enrollments свойство Student сущность будет содержать все Enrollment сущностей, которые связаны Student сущности. In this case, the Enrollments property of a Student entity will hold all of the Enrollment entities that are related to that Student entity. Другими словами если заданный Student строк в базе данных имеет два связанных Enrollment строк (значение строки, которые содержат первичный ключ этого учащегося в их StudentID внешний ключевой столбец), в котором Student сущности Enrollments свойство навигации будет содержать две этих Enrollment сущностей. In other words, if a given Student row in the database has two related Enrollment rows (rows that contain that student’s primary key value in their StudentID foreign key column), that Student entity’s Enrollments navigation property will contain those two Enrollment entities.

Свойства навигации, обычно определяются как virtual таким образом, чтобы они можно воспользоваться преимуществами определенные функциональные возможности Entity Framework, такие как отложенная загрузка. Navigation properties are typically defined as virtual so that they can take advantage of certain Entity Framework functionality such as lazy loading. (Отложенная загрузка, будет рассматриваться далее в чтение связанных данных далее в этой серии руководств.) (Lazy loading will be explained later, in the Reading Related Data tutorial later in this series.)

Если свойство навигации может содержать несколько сущностей (как в отношениях "многие ко многим" или "один ко многим"), оно должно иметь тип списка, допускающий добавление, удаление и обновление записей, такой как ICollection . If a navigation property can hold multiple entities (as in many-to-many or one-to-many relationships), its type must be a list in which entries can be added, deleted, and updated, such as ICollection .

Сущность Enrollment The Enrollment entity

В папке Models создайте файл Enrollment.cs и замените существующий код следующим кодом: In the Models folder, create Enrollment.cs and replace the existing code with the following code:

EnrollmentID Свойство будет иметь первичный ключ; эта сущность использует classname ID шаблонов вместо ID , как вы видели в Student сущности. The EnrollmentID property will be the primary key; this entity uses the classname ID pattern instead of ID by itself as you saw in the Student entity. Как правило, следует выбирать один шаблон, который будет использоваться в рамках всей модели данных. Ordinarily you would choose one pattern and use it throughout your data model. В этом случае демонстрируется возможность использования любого из шаблонов. Here, the variation illustrates that you can use either pattern. В этом руководстве, вы увидите как с помощью ID без classname позволяет упростить реализацию наследования в модели данных. In a later tutorial, you’ll see how using ID without classname makes it easier to implement inheritance in the data model.

Grade Свойство перечисления. The Grade property is an enum. Знак вопроса после Grade объявление типа указывает, что Grade свойство допускает значения NULL. The question mark after the Grade type declaration indicates that the Grade property is nullable. Корпоративного класса, который имеет значение null отличается от нулевой оценки тем — значение null означает, что это оценка не известна или еще не назначена. A grade that’s null is different from a zero grade — null means a grade isn’t known or hasn’t been assigned yet.

Свойство StudentID представляет собой внешний ключ. Ему соответствует свойство навигации Student . The StudentID property is a foreign key, and the corresponding navigation property is Student . Сущность Enrollment связана с одной сущностью Student , поэтому это свойство может содержать одну сущность Student (в отличие от представленного ранее свойства навигации Student.Enrollments , которое может содержать несколько сущностей Enrollment ). An Enrollment entity is associated with one Student entity, so the property can only hold a single Student entity (unlike the Student.Enrollments navigation property you saw earlier, which can hold multiple Enrollment entities).

Свойство CourseID представляет собой внешний ключ. Ему соответствует свойство навигации Course . The CourseID property is a foreign key, and the corresponding navigation property is Course . Сущность Enrollment связана с одной сущностью Course . An Enrollment entity is associated with one Course entity.

Платформа Entity Framework интерпретирует свойство как свойство внешнего ключа, если оно имеет имя (например, StudentID для Student свойство навигации с момента Student — первичный ключ сущности ID ). Entity Framework interprets a property as a foreign key property if it’s named

Видеоурок

Entity Framework – это отличное ORM-решение , помогающее в автоматическом режиме связывать простые классы C# с внутренними таблицами БД. Фреймворк направлен преимущественно на работу с СУБД MS SQL Server, но включает поддержку и остальных СУБД. В рамках текущего материала работает с БД MS SQL Server.

Для создания взаимодействия с сервером посредством Entity Framework нужно иметь пакет Microsoft.EntityFrameworkCore.SqlServer . Помимо этого, нужно выполнить подготовительную работу по созданию нужной БД, соответствующей моделям. Выполнить необходимое поможет Microsoft.EntityFrameworkCore.Tools . Если устанавливаем ASP .NET Core 2.0 или новее, перечисленные пакеты являются встроенными.

Для начала работы с базой данных посредством фреймворка нужен класс, который унаследовал свои свойства от Microsoft.EntityFrameworkCore.DbContext. Имея это ввиду, добавляем в каталог «Models» новый класс с названием «AppDBContext»:

Параметр DbSet включает в себя список объектов, сопоставимый с данными таблицы в БД. Руководствуясь базовыми рекомендациями, название модели нужно создавать в множественном числе, придерживаясь правил английского языка. Наглядный пример, наименование класса в модели не phone, нужно указывать слово phones.

С помощью параметра options, в контекстный конструктор данных поступают настройки для контекста. Уже внутри конструктора создаётся база данных Database.EnsureCreated(), если она не была создана ранее.

Для связи с базой данных нужно передать параметры подключения. Нужные значения указываем в файле appsettings.json. В него добавляем следующие строки:

В приведённом примере использует простейший движок БД – LocalDB. Он представляет собой облегчённый вариант SQL Server Express, ориентированный на создание приложений.

Последнее действие по настройке проекта – редактирование файла Startup.cs . Здесь нас интересует метод ConfigureServices(), его нужно редактировать.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *