Справочник по инструментам Entity Framework Core — консоль диспетчер пакетов в Visual Studio
Средства консоли диспетчер пакетов (PMC) для Entity Framework Core выполняют задачи разработки во время разработки. Например, они создают миграции, применяют миграции и создают код для модели на основе существующей базы данных. Команды выполняются внутри Visual Studio с помощью консоли диспетчер пакетов. Эти инструменты совместимы с проектами .NET Framework и .NET Core.
Если вы не используете Visual Studio, рекомендуется использовать средства командной строки EF Core. Средства командной строки .NET Core являются кроссплатформенными и выполняются в командной строке.
Установка инструментов
Установите средства консоли диспетчер пакетов, выполнив следующую команду в консоли диспетчер пакетов:
Install-Package Microsoft.EntityFrameworkCore.Tools
Обновите средства, выполнив следующую команду в консоли диспетчер пакетов.
Update-Package Microsoft.EntityFrameworkCore.Tools
Проверка установки
Убедитесь, что средства установлены, выполнив следующую команду:
Get-Help about_EntityFrameworkCore
Выходные данные выглядят следующим образом (это не указывает, какая версия инструментов, которые вы используете):
_/\__ ---==/ \\ ___ ___ |. \|\ | __|| __| | ) \\\ | _| | _| \_/ | //|\\ |___||_| / \\\/\\ TOPIC about_EntityFrameworkCore SHORT DESCRIPTION Provides information about the Entity Framework Core Package Manager Console Tools.
Использование средств
Прежде чем использовать средства, выполните следующие действия.
- Понять разницу между целевым и запускаемым проектом.
- Узнайте, как использовать средства с библиотеками классов .NET Standard.
- Для ASP.NET основных проектов задайте среду.
Целевой и запускаемый проект
Команды ссылаются на проект и проект запуска.
- Проект также называется целевым проектом , так как он содержит команды, добавляя или удаляя файлы. По умолчанию проект по умолчанию, выбранный в консоли диспетчер пакетов, является целевым проектом. Можно указать другой проект в качестве целевого проекта с помощью параметра.
- Проект запуска — это проект , который создают и запускают средства. Средства должны выполнять код приложения во время разработки для получения сведений о проекте, таких как база данных строка подключения и конфигурация модели. По умолчанию проект запуска в Обозреватель решений является запускаемым проектом. С помощью параметра можно указать другой проект в качестве запускаемого проекта.
Запускаемый проект и целевой проект часто являются одинаковыми. Типичный сценарий, когда они являются отдельными проектами:
- Контекст EF Core и классы сущностей находятся в библиотеке классов .NET Core.
- Консольное приложение .NET Core или веб-приложение ссылается на библиотеку классов.
Другие целевые платформы
Средства консоли диспетчер пакетов работают с проектами .NET Core или платформа .NET Framework. Приложения с моделью EF Core в библиотеке классов .NET Standard могут не иметь проекта .NET Core или платформа .NET Framework. Например, это верно для приложений Xamarin и универсальная платформа Windows. В таких случаях можно создать проект консольного приложения .NET Core или платформа .NET Framework, цель которого — выступать в качестве запуска проекта для инструментов. Проект может быть фиктивным проектом без реального кода— он необходим только для предоставления целевого объекта для инструментов.
Почему требуется фиктивный проект? Как упоминание ранее, средства должны выполнять код приложения во время разработки. Для этого им необходимо использовать среду выполнения .NET Core или платформа .NET Framework. Если модель EF Core находится в проекте, который предназначен для .NET Core или платформа .NET Framework, средства EF Core заимствуют среду выполнения из проекта. Они не могут сделать это, если модель EF Core находится в библиотеке классов .NET Standard. .NET Standard не является фактической реализацией .NET; Это спецификация набора API, которые должны поддерживать реализации .NET. Поэтому .NET Standard недостаточно для того, чтобы средства EF Core выполняли код приложения. Фиктивный проект, который вы создаете для запуска, предоставляет конкретную целевую платформу, в которую средства могут загружать библиотеку классов .NET Standard.
базовая среда ASP.NET
Среду для проектов ASP.NET Core можно указать в командной строке. Это и все дополнительные аргументы передаются в Program.CreateHostBuilder.
Update-Database -Args '--environment Production'
Общие параметры
В следующей таблице показаны параметры, которые являются общими для всех команд EF Core:
| Параметр | Описание |
|---|---|
| Класс DbContext для использования. Имя класса только или полное имя с пространствами имен. Если этот параметр опущен, EF Core находит класс контекста. Если существует несколько классов контекста, этот параметр является обязательным. | |
| Целевой проект. Если этот параметр опущен, проект по умолчанию для консоли диспетчер пакетов используется в качестве целевого проекта. | |
| Запускаемый проект. Если этот параметр опущен, проект Startup в свойствах решения используется в качестве целевого проекта. | |
| Аргументы, переданные приложению. | |
| -Verbose | Отображение подробных выходных данных. |
Чтобы отобразить сведения о команде, используйте команду PowerShell Get-Help .
Параметр Context , Project а также StartupProject параметры поддерживают расширение табуляции.
Миграция надстроек
Добавляет новую миграцию.
| Параметр | Описание |
|---|---|
| Имя миграции. Это позиционный параметр и является обязательным. | |
| Каталог, используемый для вывода файлов. Пути относительно целевого каталога проекта. По умолчанию используется значение «Миграции». | |
| Пространство имен, используемое для созданных классов. По умолчанию создается из выходного каталога. |
Общие параметры перечислены выше.
Миграция пакета
Создает исполняемый файл для обновления базы данных.
| Параметр | Описание |
|---|---|
| -Output | Путь к создаваемому исполняемому файлу. |
| -Force | Перезаписать существующие файлы. |
| -SelfContained | Кроме того, пакет среды выполнения .NET, поэтому его не нужно устанавливать на компьютере. |
| Целевая среда выполнения для упаковки. | |
| -Framework | Целевая платформа. По умолчанию используется первый в проекте. |
Общие параметры перечислены выше.
Drop-Database
Удаляет базу данных.
| Параметр | Описание |
|---|---|
| Показать, какая база данных будет удалена, но не удаляйте ее. |
Общие параметры перечислены выше.
Get-DbContext
Список и получение сведений о доступных DbContext типах.
Общие параметры перечислены выше.
Get-Migration
Перечисляет доступные миграции.
| Параметр | Описание |
|---|---|
| Строка подключения к базе данных. Значение по умолчанию указано в AddDbContext или OnConfiguring. | |
| Не подключайтесь к базе данных. |
Общие параметры перечислены выше.
Optimize-DbContext
Создает скомпилированную версию модели, используемой моделью DbContext .
| Параметр | Описание |
|---|---|
| Каталог, в который нужно поместить файлы. Пути относительны к каталогу проекта. | |
| Пространство имен, используемое для всех созданных классов. По умолчанию создается из корневого пространства имен и выходного каталога плюс CompiledModels . |
Общие параметры перечислены выше.
В следующем примере используются значения по умолчанию и работает только в DbContext проекте:
Optimize-DbContext
В следующем примере модель оптимизирована для контекста с указанным именем и помещает ее в отдельную папку и пространство имен:
Optimize-DbContext -OutputDir Models -Namespace BlogModels -Context BlogContext
Remove-Migration
Удаляет последнюю миграцию (откат изменений кода, выполненных для миграции).
| Параметр | Описание |
|---|---|
| Восстановление миграции (откат изменений, примененных к базе данных). |
Общие параметры перечислены выше.
Шаблон-DbContext
Создает код для DbContext типов сущностей для базы данных. Чтобы Scaffold-DbContext создать тип сущности, таблица базы данных должна иметь первичный ключ.
| Параметр | Описание |
|---|---|
| Строка подключения к базе данных. Для проектов ASP.NET Core 2.x значение может быть name= . В этом случае имя поступает из источников конфигурации, настроенных для проекта. Это позиционный параметр и является обязательным. | |
| Используемый поставщик. Обычно это имя пакета NuGet, например: Microsoft.EntityFrameworkCore.SqlServer Это позиционный параметр и является обязательным. | |
| Каталог, в который нужно поместить файлы классов сущностей. Пути относительны к каталогу проекта. | |
| Каталог, в который нужно поместить DbContext файл. Пути относительны к каталогу проекта. | |
| Пространство имен, используемое для всех созданных классов. По умолчанию создается из корневого пространства имен и выходного каталога. | |
| Пространство имен, используемое для созданного DbContext класса. Примечание. Переопределения -Namespace . | |
| Имя создаваемого DbContext класса. | |
| Схемы таблиц и представлений для создания типов сущностей. Если этот параметр опущен, все схемы включаются. Если этот параметр используется, все таблицы и представления в схемах будут включены в модель, даже если они не включены явным образом с помощью -Table. | |
| Таблицы и представления для создания типов сущностей. Таблицы или представления в определенной схеме можно включить с помощью формата schema.table или schema.view. Если этот параметр опущен, включены все таблицы и представления. | |
| Используйте атрибуты для настройки модели (по возможности). Если этот параметр опущен, используется только простой API. | |
| Используйте имена таблиц, представлений, последовательностей и столбцов точно так же, как они отображаются в базе данных. Если этот параметр опущен, имена баз данных изменяются на более тесное соответствие соглашениям о стиле имен C#. | |
| Перезаписать существующие файлы. | |
| Не создавайте DbContext.OnConfiguring . | |
| Не используйте плюрайзер. |
Общие параметры перечислены выше.
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
Пример создания шаблонов только выбранных таблиц и создает контекст в отдельной папке с указанным именем и пространством имен:
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext -ContextNamespace New.Namespace
В следующем примере считывается строка подключения из конфигурации проекта, возможно, задано с помощью средства Secret Manager.
Scaffold-DbContext "Name=ConnectionStrings:Blogging" Microsoft.EntityFrameworkCore.SqlServer
Script-DbContext
Создает скрипт SQL из DbContext. Обход любых миграций.
| Параметр | Описание |
|---|---|
| Файл для записи результата. |
Общие параметры перечислены выше.
Скрипт-миграция
Создает скрипт SQL, который применяет все изменения из одной выбранной миграции к другой выбранной миграции.
| Параметр | Описание |
|---|---|
| Начальная миграция. Миграции могут быть определены по имени или по идентификатору. Число 0 — это особый случай, который означает перед первой миграцией. Значение по умолчанию — 0. | |
| Окончание миграции. По умолчанию используется последняя миграция. | |
| Создайте скрипт, который можно использовать в базе данных при любой миграции. | |
| Не создавайте инструкции транзакций SQL. | |
| Файл для записи результата. Если этот параметр опущен, файл создается с созданным именем в той же папке, что и файлы среды выполнения приложения, например /obj/Debug/netcoreapp2.1/ghbkztfz.sql/. |
Общие параметры перечислены выше.
Параметр To , From а также Output параметры поддерживают расширение табуляции.
В следующем примере создается скрипт для миграции InitialCreate (из базы данных без каких-либо миграций), используя имя миграции.
Script-Migration 0 InitialCreate
В следующем примере создается скрипт для всех миграций после миграции InitialCreate с помощью идентификатора миграции.
Script-Migration 20180904195021_InitialCreate
Update-Database
Обновления базу данных до последней миграции или на указанную миграцию.
| Параметр | Описание |
|---|---|
| Целевая миграция. Миграции могут быть определены по имени или по идентификатору. Число 0 — это особый случай, который означает перед первой миграцией и приводит к тому, что все миграции будут отменить изменения. Если миграция не указана, команда по умолчанию используется для последней миграции. | |
| Строка подключения к базе данных. По умолчанию используется один из указанных в AddDbContext или OnConfiguring . |
Общие параметры перечислены выше.
Параметр Migration поддерживает расширение табуляции.
В следующем примере отменить изменения все миграции.
Update-Database 0
В следующих примерах база данных обновляется до указанной миграции. Первый использует имя миграции, а второй использует идентификатор миграции и указанное соединение:
Update-Database InitialCreate Update-Database 20180904195021_InitialCreate -Connection your_connection_string
Дополнительные ресурсы
- Миграции
- Реконструирование
- Скомпилированные модели
Руководство. Использование миграций EF в приложении MVC ASP.NET и развертывание в Azure
До сих пор пример веб-приложения Университета Contoso выполняется локально в IIS Express на компьютере разработчика. Чтобы сделать реальное приложение доступным для использования другими пользователями через Интернет, необходимо развернуть его в поставщике услуг веб-хостинга. В этом руководстве описано, как включить миграцию Code First и развернуть приложение в облаке в Azure:
- Включите Code First Migrations. Функция миграции позволяет изменить модель данных и развернуть изменения в рабочей среде, обновив схему базы данных без необходимости удалять и повторно создавать базу данных.
- Разверните его в Azure. Этот шаг является необязательным; Вы можете продолжить работу с оставшимися руководствами, не развертывая проект.
Мы рекомендуем использовать процесс непрерывной интеграции с системой управления версиями для развертывания, но в этом руководстве эти темы не рассматриваются. Дополнительные сведения см. в разделах о системе управления версиями и непрерывной интеграциистатьи Создание облачных приложений Real-World с помощью Azure.
Изучив это руководство, вы:
- Включение миграции Code First
- Развертывание приложения в Azure (необязательно)
Предварительные требования
Включение миграции Code First
При разработке нового приложения ваша модель данных часто меняется, и при каждом таком изменении она нарушает синхронизацию с базой данных. Вы настроили Entity Framework для автоматического удаления и повторного создания базы данных при каждом изменении модели данных. При добавлении, удалении или изменении классов сущностей или изменении DbContext класса при следующем запуске приложения оно автоматически удаляет существующую базу данных, создает новую, соответствующую модели, и заполняет ее тестовые данные.
Этот способ для обеспечения синхронизации базы данных с моделью данных хорошо работает до развертывания приложения в рабочей среде. Когда приложение выполняется в рабочей среде, оно обычно хранит данные, которые вы хотите сохранить, и вы не хотите терять все при каждом внесении изменений, таких как добавление нового столбца. Функция Code First Migrations решает эту проблему, позволяя Code First обновить схему базы данных вместо удаления и повторного создания базы данных. В этом руководстве вы развернете приложение, а для подготовки к этому включите миграции.
-
Отключите инициализатор, настроенный ранее, закомментируйте или удалив contexts элемент, добавленный в файл Web.config приложения.
enable-migrations add-migration InitialCreate
Команда enable-migrations создает папку Migrations в проекте ContosoUniversity и помещает в нее файл Configuration.cs , который можно изменить для настройки миграций. (Если вы пропустили описанный выше шаг, указывающий на изменение имени базы данных, служба миграции найдет существующую базу данных и автоматически выполнит add-migration команду. Это нормально, это просто означает, что вы не будете выполнять тест кода миграции перед развертыванием базы данных. Позже при выполнении update-database команды ничего не произойдет, так как база данных уже существует.) Откройте файл ContosoUniversity\Migrations\Configuration.cs . Как и класс инициализатора, который вы видели ранее, класс Configuration включает Seed метод .
internal sealed class Configuration : DbMigrationsConfiguration < public Configuration() < AutomaticMigrationsEnabled = false; >protected override void Seed(ContosoUniversity.DAL.SchoolContext context) < // This method will be called after migrating to the latest version. // You can use the DbSet.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person < FullName = "Andrew Peters" >, // new Person < FullName = "Brice Lambson" >, // new Person < FullName = "Rowan Miller" >// ); // > >
Настройка метода Seed
При удалении и повторном создании базы данных для каждого изменения модели данных используется метод класса инициализатора Seed для вставки тестовых данных, так как после каждого изменения модели база данных удаляется и все тестовые данные теряются. При использовании Code First Migrations тестовые данные сохраняются после изменений базы данных, поэтому включать тестовые данные в метод Seed обычно не требуется. На самом деле, вы не хотите Seed , чтобы метод вставлял тестовые данные, если вы будете использовать миграции для развертывания базы данных в рабочей среде, так как Seed метод будет выполняться в рабочей среде. В этом случае требуется Seed , чтобы метод вставлял в базу данных только данные, необходимые в рабочей среде. Например, может потребоваться, чтобы база данных включала в таблицу Department фактические имена отделов, когда приложение станет доступным в рабочей среде.
В этом руководстве вы будете использовать миграции для развертывания, но ваш Seed метод в любом случае будет вставлять тестовые данные, чтобы упростить представление о работе функциональных возможностей приложения без необходимости вручную вставлять большое количество данных.
-
Замените содержимое файла Configuration.cs следующим кодом, который загружает тестовые данные в новую базу данных.
namespace ContosoUniversity.Migrations < using ContosoUniversity.Models; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration < public Configuration() < AutomaticMigrationsEnabled = false; >protected override void Seed(ContosoUniversity.DAL.SchoolContext context) < var students = new List< new Student < FirstMidName = "Carson", LastName = "Alexander", EnrollmentDate = DateTime.Parse("2010-09-01") >, new Student < FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse("2012-09-01") >, new Student < FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse("2013-09-01") >, new Student < FirstMidName = "Gytis", LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2012-09-01") >, new Student < FirstMidName = "Yan", LastName = "Li", EnrollmentDate = DateTime.Parse("2012-09-01") >, new Student < FirstMidName = "Peggy", LastName = "Justice", EnrollmentDate = DateTime.Parse("2011-09-01") >, new Student < FirstMidName = "Laura", LastName = "Norman", EnrollmentDate = DateTime.Parse("2013-09-01") >, new Student < FirstMidName = "Nino", LastName = "Olivetto", EnrollmentDate = DateTime.Parse("2005-08-11") >>; students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s)); context.SaveChanges(); var courses = new List < new Course , new Course , new Course , new Course , new Course , new Course , new Course >; courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s)); context.SaveChanges(); var enrollments = new List < new Enrollment < StudentID = students.Single(s =>s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID, Grade = Grade.C >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Alonso").ID, CourseID = courses.Single(c => c.Title == "Composition" ).CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Anand").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Anand").ID, CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Barzdukas").ID, CourseID = courses.Single(c => c.Title == "Chemistry").CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Li").ID, CourseID = courses.Single(c => c.Title == "Composition").CourseID, Grade = Grade.B >, new Enrollment < StudentID = students.Single(s =>s.LastName == "Justice").ID, CourseID = courses.Single(c => c.Title == "Literature").CourseID, Grade = Grade.B > >; foreach (Enrollment e in enrollments) < var enrollmentInDataBase = context.Enrollments.Where( s =>s.Student.ID == e.StudentID && s.Course.CourseID == e.CourseID).SingleOrDefault(); if (enrollmentInDataBase == null) < context.Enrollments.Add(e); >> context.SaveChanges(); > > >
Метод Seed принимает объект контекста базы данных в качестве входного параметра, а код в методе использует этот объект для добавления новых сущностей в базу данных. Для каждого типа сущности код создает коллекцию новых сущностей, добавляет их в соответствующее свойство DbSet , а затем сохраняет изменения в базе данных. Не нужно вызывать метод SaveChanges после каждой группы сущностей, как показано здесь, но это поможет найти источник проблемы при возникновении исключения во время записи кода в базу данных. Некоторые операторы, которые вставляют данные, используют метод AddOrUpdate для выполнения операции upsert. Seed Так как метод выполняется каждый раз при выполнении update-database команды, обычно после каждой миграции невозможно просто вставить данные, так как строки, которые вы пытаетесь добавить, уже будут там после первой миграции, создающей базу данных. Операция upsert предотвращает ошибки, которые могут возникнуть при попытке вставить уже существующую строку, но переопределяет любые изменения данных, которые могли быть внесены во время тестирования приложения. Если тестовые данные находятся в некоторых таблицах, это может не произойти. В некоторых случаях при изменении данных во время тестирования требуется, чтобы изменения сохранялись после обновления базы данных. В этом случае требуется выполнить условную операцию вставки: вставить строку, только если она еще не существует. Метод Seed использует оба подхода. Первый параметр, передаваемый методу AddOrUpdate, указывает свойство для проверка, если строка уже существует. Для данных тестового учащегося, которые вы предоставляете, свойство можно использовать для этой цели, LastName так как каждая фамилия в списке уникальна:
context.Students.AddOrUpdate(p => p.LastName, s)
В этом коде предполагается, что фамилии уникальны. При добавлении учащегося с повторяющимся именем вы получите следующее исключение при следующем выполнении миграции: Последовательность содержит несколько элементов Сведения об обработке избыточных данных, таких как два учащегося с именем «Александр Карсон» , см. в блоге Рика Андерсона. Дополнительные сведения о методе см. в AddOrUpdate статье Использование метода AddOrUpdate для EF 4.3 в блоге Джули Лерман. В коде, который создает Enrollment сущности, предполагается, что у вас есть ID значение в сущностях в students коллекции, хотя это свойство не задано в коде, который создает коллекцию.
new Enrollment < StudentID = students.Single(s =>s.LastName == "Alexander").ID, CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, Grade = Grade.A >,
Здесь можно использовать ID свойство , так как ID значение задается при вызове SaveChanges students для коллекции. EF автоматически получает значение первичного ключа при вставке сущности в базу данных и обновляет ID свойство сущности в памяти. Код, добавляющий каждую Enrollment сущность в Enrollments набор сущностей, не использует AddOrUpdate метод . Он проверяет, существует ли сущность, и вставляет сущность, если она не существует. Этот подход сохраняет изменения, внесенные в оценку регистрации с помощью пользовательского интерфейса приложения. Код циклически выполняется по каждому члену Enrollment списка , и если регистрация не найдена в базе данных, он добавляет регистрацию в базу данных. При первом обновлении базы данных она будет пустой, поэтому она будет добавлять каждую регистрацию.
foreach (Enrollment e in enrollments) < var enrollmentInDataBase = context.Enrollments.Where( s =>s.Student.ID == e.Student.ID && s.Course.CourseID == e.Course.CourseID).SingleOrDefault(); if (enrollmentInDataBase == null) < context.Enrollments.Add(e); >>
Выполнение первой миграции
При выполнении add-migration команды Migrations сгенерировал код, который создаст базу данных с нуля. Этот код также находится в папке Migrations в файле с именем _InitialCreate.cs. Метод Up InitialCreate класса создает таблицы базы данных, соответствующие наборам сущностей модели данных, и Down метод удаляет их.
public partial class InitialCreate : DbMigration < public override void Up() < CreateTable( "dbo.Course", c =>new < CourseID = c.Int(nullable: false), Title = c.String(), Credits = c.Int(nullable: false), >) .PrimaryKey(t => t.CourseID); CreateTable( "dbo.Enrollment", c => new < EnrollmentID = c.Int(nullable: false, identity: true), CourseID = c.Int(nullable: false), StudentID = c.Int(nullable: false), Grade = c.Int(), >) .PrimaryKey(t => t.EnrollmentID) .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: true) .ForeignKey("dbo.Student", t => t.StudentID, cascadeDelete: true) .Index(t => t.CourseID) .Index(t => t.StudentID); CreateTable( "dbo.Student", c => new < false, identity: true), LastName = c.String(), FirstMidName = c.String(), EnrollmentDate = c.DateTime(nullable: false), >) .PrimaryKey(t => t.ID); > public override void Down() < DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student"); DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course"); DropIndex("dbo.Enrollment", new[] < "StudentID" >); DropIndex("dbo.Enrollment", new[] < "CourseID" >); DropTable("dbo.Student"); DropTable("dbo.Enrollment"); DropTable("dbo.Course"); > >
Функция миграций вызывает метод Up , чтобы реализовать изменения модели данных для миграции. При вводе команды для отката обновления функция миграций вызывает метод Down .
Это начальная миграция, созданная при вводе add-migration InitialCreate команды. Параметр ( InitialCreate в примере) используется для имени файла и может быть любым. Обычно вы выбираете слово или фразу, которые суммируют действия, выполняемые в миграции. Например, последнюю миграцию можно назвать «AddDepartmentTable».
Если вы создали первоначальную миграцию, когда база данных уже существовала, код для создания базы данных формируется, но выполнять его не требуется, так как база данных уже соответствует модели данных. Однако при развертывании приложения в другой среде, где база данных еще не существует, этот код будет выполняться для создания базы данных, поэтому рекомендуется сначала его протестировать. Вот почему вы изменили имя базы данных в строке подключения ранее, чтобы миграции могли создать новую базу данных с нуля.
- В окне Консоль диспетчера пакетов введите следующую команду: update-database Команда update-database запускает Up метод для создания базы данных, а затем запускает Seed метод для заполнения базы данных. Этот же процесс будет выполняться автоматически в рабочей среде после развертывания приложения, как показано в следующем разделе.
- Используйте серверную Обозреватель для проверки базы данных, как это было описано в первом руководстве, и запустите приложение, чтобы убедиться, что все работает так же, как и раньше.
Развернуть в Azure
До сих пор приложение выполнялось локально в IIS Express на компьютере разработки. Чтобы сделать его доступным для других пользователей через Интернет, необходимо развернуть его у поставщика услуг веб-хостинга. В этом разделе руководства вы развернете его в Azure. Этот раздел является необязательным; Вы можете пропустить это и продолжить работу со следующим руководством или адаптировать инструкции в этом разделе для другого поставщика услуг размещения по своему выбору.
Использование миграции Code First для развертывания базы данных
Чтобы развернуть базу данных, используйте Code First Migrations. При создании профиля публикации, который используется для настройки параметров развертывания из Visual Studio, вы выберете проверка поле с меткой Обновить базу данных. Этот параметр заставляет процесс развертывания автоматически настроить файл Web.config приложения на целевом сервере, чтобы Code First использовал класс инициализатора MigrateDatabaseToLatestVersion .
Visual Studio не выполняет никаких действий с базой данных во время развертывания во время копирования проекта на целевой сервер. Когда вы запускаете развернутое приложение и оно обращается к базе данных в первый раз после развертывания, Code First проверяет, соответствует ли база данных модели данных. В случае несоответствия Code First автоматически создает базу данных (если она еще не существует) или обновляет схему базы данных до последней версии (если база данных существует, но не соответствует модели). Если приложение реализует метод Migrations Seed , метод запускается после создания базы данных или обновления схемы.
Метод Migrations Seed вставляет тестовые данные. При развертывании в рабочей среде необходимо изменить Seed метод таким образом, чтобы он вставлял только данные, которые нужно вставить в рабочую базу данных. Например, в текущей модели данных может потребоваться, чтобы в базе данных разработчиков были реальные курсы, но вымышленные учащиеся. Вы можете написать Seed метод для загрузки в разработку, а затем закомментировать вымышленных учащихся перед развертыванием в рабочей среде. Вы также можете написать метод для загрузки только курсов и ввести вымышленных учащихся в тестовую Seed базу данных вручную с помощью пользовательского интерфейса приложения.
Получение учетной записи Azure
Вам потребуется учетная запись Azure. Если у вас еще нет подписки, но у вас есть подписка Visual Studio, вы можете активировать преимущества подписки. В противном случае вы можете создать бесплатную пробную учетную запись всего за несколько минут. Дополнительные сведения см. в разделе Бесплатная пробная версия Azure.
Создание веб-сайта и базы данных SQL в Azure
Веб-приложение в Azure будет выполняться в общей среде размещения, то есть оно выполняется на виртуальных машинах, которые совместно используются для других клиентов Azure. Общая среда внешнего размещения – это недорогой способ начать работу в облачной среде. Если позднее ваш веб-трафик увеличится, приложение можно масштабировать по необходимости, запуская его на выделенных виртуальных машинах. Дополнительные сведения о вариантах ценообразования для Служба приложений Azure см. в Служба приложений ценах.
Вы развернете базу данных в Azure SQL базе данных. База данных SQL — это облачная служба реляционных баз данных, созданная на основе SQL Server технологий. Средства и приложения, работающие с SQL Server также работать с базой данных SQL.

- На портале управления Azure выберите Создать ресурс на вкладке слева, а затем щелкните Просмотреть все в области Создание (или колонке), чтобы просмотреть все доступные ресурсы. Выберите Веб-приложение + SQL в разделе Веб колонки Все . Наконец, нажмите кнопку Создать. Откроется форма для создания нового ресурса веб-приложения и SQL .
- Введите строку в поле Имя приложения , которая будет использоваться в качестве уникального URL-адреса приложения. Полный URL-адрес будет состоять из того, что вы вводите здесь, а также домена по умолчанию служб приложение Azure (.azurewebsites.net). Если имя приложения уже выбрано, мастер уведомит вас красным сообщением Имя приложения недоступно . Если имя приложения доступно, вы увидите зеленую галочку.
- В поле Подписка выберите подписку Azure, в которой должен находиться Служба приложений.
- В текстовом поле Группа ресурсов выберите группу ресурсов или создайте новую. Этот параметр указывает, в каком центре обработки данных будет работать веб-сайт. Дополнительные сведения о группах ресурсов см. в разделе Группы ресурсов.
- Создайте план Служба приложений, щелкнув раздел Служба приложенийСоздать и заполните Служба приложений план (может быть таким же именем, как Служба приложений), Расположение и Ценовая категория (доступен бесплатный вариант).
- Щелкните База данных SQL, а затем выберите Создать новую базу данных или выберите существующую.
- В поле Имя введите имя базы данных.
- Щелкните поле Целевой сервер и выберите Создать новый сервер. Кроме того, если вы ранее создали сервер, его можно выбрать из списка доступных серверов.
- Выберите раздел Ценовая категория , а затем — Бесплатный. Если требуются дополнительные ресурсы, базу данных можно масштабировать в любое время. Дополнительные сведения о ценах на Azure SQL см. в разделе Цены на базу данных Azure SQL.
- При необходимости измените параметры сортировки .
- Введите имя администратора SQL Администратор имя пользователя и пароль sql Администратор.
- Если вы выбрали Новый сервер База данных SQL, определите новое имя и пароль, которые будут использоваться позже при доступе к базе данных.
- Если вы выбрали ранее созданный сервер, введите учетные данные для этого сервера.
- Сбор данных телеметрии можно включить для Служба приложений с помощью Application Insights. При небольшой конфигурации Application Insights собирает ценные сведения о событиях, исключениях, зависимостях, запросах и трассировках. Дополнительные сведения о Application Insights см. в статье Azure Monitor.
- Нажмите кнопку Создать внизу, чтобы указать, что все готово. Портал управления возвращается на страницу Панель мониторинга, а область Уведомления в верхней части страницы показывает, что сайт создается. Через некоторое время (обычно менее минуты) появляется уведомление о том, что развертывание выполнено успешно. На панели навигации слева в разделе Службы приложений появится новое Служба приложений, а новая база данных SQL — в разделе Базы данных SQL.
Развертывание приложения в Azure
- В Visual Studio щелкните правой кнопкой мыши проект в обозревателе решений и выберите Опубликовать в контекстном меню.
- На странице Выбор целевого объекта публикации выберите Служба приложений, а затем Выберите существующий, а затем нажмите кнопку Опубликовать.

- Если вы ранее не добавляли подписку Azure в Visual Studio, выполните действия на экране. Эти действия позволяют Visual Studio подключиться к подписке Azure, чтобы список Служб приложений включал ваш веб-сайт.
- На странице Служба приложений выберите подписку, в Служба приложений. В разделе Представление выберите Группа ресурсов. Разверните группу ресурсов, в который вы добавили Служба приложений, и выберите Служба приложений. Нажмите кнопку ОК , чтобы опубликовать приложение.
- В окне Вывод указывается, какие действия по развертыванию были выполнены, а также сообщается об успешном завершении развертывания.
- После успешного развертывания браузер по умолчанию автоматически открывает URL-адрес развернутого веб-сайта.
Теперь приложение работает в облаке.
На этом этапе база данных SchoolContext была создана в базе данных Azure SQL, так как вы выбрали выполнить Code First Migrations (выполняется при запуске приложения). Файл Web.config на развернутом веб-сайте был изменен таким образом, что инициализатор MigrateDatabaseToLatestVersion запускается при первом чтении или записи данных в базе данных (что произошло при выборе вкладки Учащиеся ):

В процессе развертывания также была создана новая строка подключения (SchoolContext_DatabasePublish), которую Code First Migrations использовать для обновления схемы базы данных и заполнения базы данных.

Развернутую версию файла Web.config можно найти на своем компьютере в ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. Вы можете получить доступ к самому развернутой Web.config файлу с помощью FTP. Инструкции см . в разделе ASP.NET веб-развертывание с помощью Visual Studio: развертывание обновления кода. Следуйте инструкциям, которые начинаются с «Чтобы использовать средство FTP, вам потребуется три вещи: URL-адрес FTP, имя пользователя и пароль».
Веб-приложение не реализует безопасность, поэтому любой, кто находит URL-адрес, может изменить данные. Инструкции по защите веб-сайта см. в статье Развертывание безопасного приложения MVC ASP.NET с использованием членства, OAuth и базы данных SQL в Azure. Вы можете запретить другим пользователям использовать сайт, остановив службу с помощью портала управления Azure или серверной Обозреватель в Visual Studio.

Сценарии расширенной миграции
Если вы развертываете базу данных, автоматически выполняя миграции, как показано в этом руководстве, и выполняете развертывание на веб-сайте, работающем на нескольких серверах, вы можете получить несколько серверов, пытающихся выполнить миграцию одновременно. Миграции являются атомарными, поэтому если два сервера попытаются выполнить одну и ту же миграцию, один из них завершится успешно, а другой завершится ошибкой (при условии, что операции невозможно выполнить дважды). В этом сценарии, если вы хотите избежать этих проблем, вы можете вызвать миграцию вручную и настроить собственный код, чтобы это произошло только один раз. Дополнительные сведения см. в статье Выполнение и создание скриптов миграции из кода в блоге и Migrate.exe Rowan Miller (для выполнения миграций из командной строки).
Сведения о других сценариях миграции см. в разделе Миграции Серии экранных трансляций.
Обновление конкретной миграции
update-database -target MigrationName
Команда update-database -target MigrationName выполняет целевую миграцию.
Игнорировать изменения миграции в базе данных
Add-migration MigrationName -ignoreChanges
ignoreChanges создает пустую миграцию с текущей моделью в качестве snapshot.
Инициализаторы Code First
В разделе развертывания вы видели, как используется инициализатор MigrateDatabaseToLatestVersion . Code First также предоставляет другие инициализаторы, включая CreateDatabaseIfNotExists (по умолчанию), DropCreateDatabaseIfModelChanges (который использовался ранее) и DropCreateDatabaseAlways. Инициализатор DropCreateAlways может быть полезен для настройки условий для модульных тестов. Вы также можете написать собственные инициализаторы и вызвать инициализатор явным образом, если не хотите ждать, пока приложение считывает данные из базы данных или записывает их в базу данных.
Получите код
Дополнительные ресурсы
Ссылки на другие ресурсы Entity Framework можно найти в разделе ASP.NET Доступ к данным — рекомендуемые ресурсы.
Дальнейшие действия
Изучив это руководство, вы:
- Включенные миграции Code First
- Развернуто приложение в Azure (необязательно)
Перейдите к следующей статье, чтобы узнать, как создать более сложную модель данных для ASP.NET приложения MVC.
Имя add migration не распознано как имя командлета
Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Последнее обновление: 16.11.2019
Создадим первое простенькое приложение на ASP.NET Core MVC, которое призвано дать понимание, как работает данная платформа. Вначале создадим новый проект. Назовем его MobileStore . В качестве шаблона проекта выберем Web Application (View-Model-Controller):

Наше приложение будет очень простым и будет представлять магазин смартфонов. Какие основные функции у любого магазина — предоставлять товар на продажу и принимать заказы на товар. В связи с этим мы можем выделить прежде всего две модели: модель смартфона и модель заказа.
Итак, в проекте уже есть папка для хранения моделей — папка Models , поэтому поместим в нее новый класс, который назовем Phone и который будет представлять модель смартфона:
public class Phone < public int Id < get; set; >public string Name < get; set; >public string Company < get; set; >public int Price < get; set; >>
Модель телефона имеет четыре свойства: Id, название, производитель и цена.
И также добавим в папку Models новый класс, который будет представлять заказ:
public class Order < public int OrderId < get; set; >public string User < get; set; >// имя фамилия покупателя public string Address < get; set; >// адрес покупателя public string ContactPhone < get; set; >// контактный телефон покупателя public int PhoneId < get; set; >// ссылка на связанную модель Phone public Phone Phone < get; set; >>
Здесь все свойства довольно простые кроме двух последних. Два последних свойства вместе представляют внешний ключ на связанную модель Phone.
После определения моделей надо выбрать хранилище данных для этих моделей. Мы будем использовать MS SQL Server. Для работы с MS SQL Server компания Microsoft рекомендует использовать ORM-технологию Entity Framework, хотя ее использование необязательно. Мы также можем применять другие ORM-технологии или доступные средства ADO.NET. Преимущество фреймворка Entity Framework состоит в том, что он позволяет абстрагироваться от структуры конкретной базы данных и вести все операции с данными через модель.
В данном случае для взаимодействия с MS SQL Server через Entity Framework нам нужен пакет Microsoft.EntityFrameworkCore.SqlServer . Поэтому добавим данный пакет через пакетный менеджер NuGet:

Чтобы взаимодействовать с базой данных нам нужен контекст данных. Причем Entity Framework Core использует подход Code First, при котором нам надо сначала определить модели и контекст данных, а потом уже исходя и этих моделей и класса контекста будет создаваться бд и все ее таблицы.
Поэтому добавим в папку Models новый класс, который назовем MobileContext и который будет иметь следующий код:
using Microsoft.EntityFrameworkCore; namespace MobileStore.Models < public class MobileContext : DbContext < public DbSetPhones < get; set; >public DbSet Orders < get; set; >public MobileContext(DbContextOptions options) : base(options) < Database.EnsureCreated(); >> >
Чтобы создать контекст, нам надо унаследовать новый класс от класса DbContext . Свойства наподобие public DbSet Phones < get; set; >помогают получать из БД набор данных определенного типа (например, набор объектов Phone). Фактически каждое свойство DbSet будет соотноситься с отдельной таблицей в базе данных.
По умолчанию у нас база данных отсутствуют. Поэтому в конструктор MobileContext определен вызов Database.EnsureCreated() , который при отсутствии базы данных автоматически создает ее. Если база данных уже есть, то ничего не происходит.
Чтобы подключаться к базе данных, нам надо задать параметры подключения. Для этого изменим файл appsettings.json . По умолчанию он содержит только настройки логгирования:
< "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" >>, "AllowedHosts": "*" >
Теперь изменим его, добавив определение строки подключения:
< "ConnectionStrings": < "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=mobilestoredb;Trusted_Connection=True;MultipleActiveResultSets=true" >, "Logging": < "LogLevel": < "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" >>, "AllowedHosts": "*" >
В данном случае мы будем использовать упрощенный движок базы данных LocalDB, который представляет легковесную версию SQL Server Express, предназначенную специально для разработки приложений. Об этом говорит параметр Server=(localdb)\\mssqllocaldb . Ну а сама база данных будет называться mobilestoredb .
И последним шагом в настройке проекта является изменение файла Startup.cs. В нем нам надо изменить метод ConfigureServices() :
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using MobileStore.Models; // пространство имен моделей using Microsoft.EntityFrameworkCore; // пространство имен EntityFramework using Microsoft.Extensions.Hosting; namespace MobileStore < public class Startup < public Startup(IConfiguration configuration) < Configuration = configuration; >public IConfiguration Configuration < get; >public void ConfigureServices(IServiceCollection services) < string connection = Configuration.GetConnectionString("DefaultConnection"); services.AddDbContext(options => options.UseSqlServer(connection)); services.AddControllersWithViews(); > public void Configure(IApplicationBuilder app) < app.UseDeveloperExceptionPage(); app.UseStaticFiles(); app.UseRouting(); app.UseEndpoints(endpoints =>< endpoints.MapControllerRoute( name: "default", pattern: "//"); >); > > >
Ошибка в EF 6.4 The term ‘enable-migrations’ is not recognized as the name of a cmdlet, function, script file, or operable program
Ранее я пользовался подходом code-first и не было не каких проблем. Установлена была версия EntityFramework 6.2.0 . Студия предложила обновить до версии 6.4.4 . После обновления я создал новый проект Win Forms попробовал включить миграцию командой: enable-migrations , но теперь выходит ошибка:
> The term 'enable-migrations' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:18 + enable-migrations
Но, если сменить версию EntityFramework назад на 6.2.0 , всё отлично создаётся и нет ошибки. Подскажите пожалуйста, может кто знает, что сменилось с новой версией EntityFramework , что я делаю не так? UPDATE:
Если просто закрыть проект, а потом заного запустить с версией Entity 6.4.4 , при старте сразу же в консоли вылезает вот такая вот ошибка:
> Missing function body in function declaration. At D:\WindowsFormsApp2\packages\EntityFramework.6.4.4\tools\EntityFramework6.PS2.psm1:241 char:5 +