Миграции

Создание начальной & базы данных model

Прежде чем мы начнем использовать миграции, нам потребуется проект и модель Code First, с которой мы будем работать. В этом пошаговом руководстве мы собираемся использовать каноническую модель Blog и Post.

  • Создание нового консольного приложения мигратионсаутоматикдемо
  • Добавьте последнюю версию пакета NuGet EntityFramework в проект.
    • Средства — Диспетчер пакетов библиотеки —> Консоль диспетчера пакетов
    • Запустите команду EntityFramework Install-Package
  • Добавьте файл Model.cs с кодом, показанным ниже. Этот код определяет один класс Blog, составляющий нашу модель предметной области, и класс BlogContext, который будет нашим контекстом EF Code First.

Теперь, когда у нас есть модель, пора использовать ее для доступа к данным. Внесите в файл Program.cs приведенный ниже код.

Запустите приложение, и вы увидите, что база данных мигратионсаутоматиккодедемо. BlogContext создана.

Применение миграции

Введите следующую команду в командном окне, чтобы создать базу данных и таблицы в ней.

Выходные данные команды аналогичны команде , за исключением того, что вы видите журналы для команд SQL, настраивающих базу данных. В приведенном ниже примере выходных данных большинство журналов опущено. Если вам не нужен такой уровень детализации сообщений журнала, можно изменить уровень ведения журнала в файле appsettings.Development.json. Дополнительные сведения см. в разделе Ведение журнала в .NET Core и ASP.NET Core.

Используйте обозреватель объектов SQL Server для проверки базы данных, как описано в первом руководстве. Вы заметите добавление таблицы __EFMigrationsHistory, отслеживающей миграции, которые были применены к базе данных. Просмотрев данные в этой таблице, вы увидите одну строку для первой миграции. (Последний журнал в предыдущем примере выходных данных интерфейса командной строки показывает оператор INSERT, создающий эту строку.)

Запустите приложение, чтобы убедиться, что все работает, как и раньше.

Создание миграции для существующей базы данных¶

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

$ bincake bake migration_snapshot Initial

Это заставит сгенерировать файл миграции с именем YYYYMMDDHHMMSS_Initial.php,
содержащий все инструкции create для всех таблиц в вашей базе данных.

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

Если же вам нужно создать снимок из другого источника данных (из другой настройки),
вы можете использовать опцию :

$ bincake bake migration_snapshot Initial --connection my_other_connection

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

$ bincake bake migration_snapshot Initial --require-table

При использовании флага оболочка будет просматривать классы
вашего приложения и будет добавлять таблицы модели в моментальный снимок.

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

$ bincake bake migration_snapshot Initial --plugin MyPlugin

В моментальный снимок вашего плагина будут добавлены только те таблицы, у которых
есть класс объектной модели .

Примечание

При создании моментального снимка для плагина, файлы миграции будут созданы
в каталоге config/Migrations вашего плагина.

Пример конфликта слияния

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

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

Разработчик #1 и разработчик #2 теперь вносит некоторые изменения в модель EF в своей локальной базе кода. Разработчик #1 добавляет свойство рейтинга в блог — и создает миграцию аддратинг , чтобы применить изменения к базе данных. #2 разработчика добавляет в блог свойство » читатели » и создает соответствующую миграцию аддреадерс . Оба разработчика выполняют Обновление базы данных, применяют изменения к их локальным базам данных, а затем продолжают разработку приложения.

Примечание

Для миграции используется префикс отметок времени, поэтому наш график представляет, что Аддреадерс миграция от разработчика #2 находится после Аддратинг миграции от #1 разработчиков. Как #1 разработчиков, так и #2, в первую очередь, не отличаются от проблем, связанных с работой в команде, или процесса слияния, который мы рассмотрим в следующем разделе.

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

Пришло время отправить #2 разработчиков. Они не так счастливы. Так как кто-то другой отправил изменения с момента их синхронизации, им потребуется извлечь изменения и выполнить слияние. Система управления версиями, скорее всего, сможет автоматически объединить изменения на уровне кода, так как они очень просты. Состояние локального репозитория разработчика #2 после синхронизации показано на следующем рисунке. 

На этом этапе разработчик #2 может выполнить Update-Database , который обнаружит новую миграцию аддратинг (которая не была применена к базе данных разработчика #2) и применит ее. Теперь столбец рейтинга добавляется в таблицу блоги , и база данных синхронизируется с моделью.

Существует несколько проблем:

  1. Несмотря на то, что Update-Database будет применять аддратинг миграцию, также будет выдано предупреждение: невозможно обновить базу данных в соответствии с текущей моделью, так как имеются ожидающие изменения и отключена автоматическая миграция… Проблема заключается в том, что для моментального снимка модели, хранящегося в последней миграции (аддреадер), отсутствует свойство рейтинга в блоге (поскольку оно не было частью модели при создании миграции). Code First обнаруживает, что модель в последней миграции не соответствует текущей модели и вызывает предупреждение.
  2. Запуск приложения приведет к тому, что «модель резервного копирования контекста» BloggingContext «изменилась с момента создания базы данных. попробуйте использовать Code First Migrations для обновления базы данных… » опять же, проблема заключается в том, что моментальный снимок модели, хранящийся во время последней миграции, не соответствует текущей модели.
  3. Наконец, мы предполагаем, что при выполнении Add-Migration будет создан пустой перенос (поскольку нет изменений, применимых к базе данных). Но поскольку миграция сравнивает текущую модель с последней миграцией (в которой отсутствует свойство рейтинга ), она фактически формирует формирование шаблона другого вызова addColumn для добавления в столбец рейтинга . Разумеется, эта миграция может завершиться ошибкой во время обновления базы данных , поскольку столбец рейтинга уже существует.

Создание первоначальной миграции

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

  • Щелкните правой кнопкой мыши проект в обозревателе решений и выберите в контекстном меню пункт Открыть папку в проводнике.

  • Введите «cmd» в адресной строке и нажмите клавишу ВВОД.

Введите в командном окне следующую команду:

Приведенные выше команды выводят результат наподобие следующего:

Если отображается сообщение об ошибке «Доступ к файлу… ContosoUniversity.dll невозможен, так как файл используется другим процессом«, найдите значок IIS Express в области уведомлений Windows, щелкните его правой кнопкой мыши, а затем выберите ContosoUniversity > Остановить сайт.

Структура миграций

Класс миграции содержит два метода: и . Метод используется для добавления новых таблиц, столбцов или индексов в вашу базу данных, тогда как метод должен отменять операции, выполняемые методом .

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

Указание соединения миграции

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

Создание и применение миграций в EF Core

Использование миграции — это стандартный способ создания и обновления базы данных с помощью Entity Framework Core. Процесс миграции состоит из двух этапов: создание миграции и применение миграции. Как мы уже говорили, схема нашей базы данных должна быть согласована с моделью базы данных, и каждое изменение в модели базы данных необходимо переносить в саму базу данных.

Эти изменения могут быть, например, следующими:

  • Изменения в свойствах класса модели
  • Изменения конфигурации
  • Добавление или удаление свойств из класса контекста

Начиная с ASP.NET Core 3.0 инструменты EF Core, необходимые для миграции, не устанавливаются предварительно. Следовательно, мы должны установить библиотеку . Если вы следите за этой серией с самого начала, значит, у вас уже установлена ​​библиотека .

Чтобы создать миграцию, мы можем использовать окно консоли диспетчера пакетов Visual Studio или командное окно (командная строка Windows) :

Добавление миграции Add-Migration MigrationName

Или через интерфейс командной строки dotnet:

dotnet ef migrations добавить MigrationName

В нашем приложении мы собираемся использовать Консоль диспетчера пакетов (PMC), поэтому давайте сделаем это, набрав:

После того, как мы нажмем клавишу Enter, наша миграция будет завершена.

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

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

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

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

Применение созданной миграции

После того, как мы успешно создали нашу миграцию, мы должны применить ее, чтобы изменения вступили в силу в базе данных. Существует несколько способов применения миграции (с использованием сценариев SQL, с использованием метода Database.Migrate или с использованием методов командной строки), и, как мы делали с созданием, мы собираемся использовать подход методов командной строки.

Для консоли диспетчера пакетов команда:

Update-Database

Для окна командной строки команда:

dotnet ef database update

Поскольку мы уже определились с PMC, давайте откроем окно PMC и выполним команду:

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

Есть еще несколько важных фактов, которые нам нужно знать о миграции EF Core. Если мы проверим нашу базу данных, мы найдем еще одну созданную таблицу: . EF Core использует эту таблицу для отслеживания всех примененных миграций. Таким образом, это означает, что если мы создадим еще одну миграцию в нашем коде и применим ее, EF Core применит только недавно созданную миграцию.

Но как EF Core узнает, какую миграцию нужно применить?

Ну, он сохраняет уникальный идентификатор в , который представляет собой уникальное имя файла миграции, созданного при миграции, и никогда больше не выполняет файлы с тем же именем:

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

Необходимо учитывать следующие моменты:

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

Значения по умолчанию или вычисляемые имена не могут соответствовать существующей схеме

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

Ниже приведены некоторые примеры того, когда необходимо помнить об этом.

Если вы использовали параметр «вариант 1: использовать существующую схему в качестве начальной точки» из шага 3:

Если будущие изменения в модели требуют изменения или удаления одного из объектов базы данных, названных по-другому, необходимо изменить шаблонную миграцию, указав правильное имя. API-интерфейсы миграции имеют необязательный параметр name, позволяющий сделать это.
Например, существующая схема может содержать таблицу Post со столбцом внешнего ключа Блогид, имеющего индекс с именем IndexFk_BlogId. Однако миграция по умолчанию предполагает, что этот индекс будет называться IX_BlogId. При внесении изменений в модель, которая приведет к удалению этого индекса, необходимо будет изменить сформированный вызов событие DropIndex, указав имя IndexFk_BlogId.

Если вы использовали команду «параметр 2: использовать пустую базу данных как начальную точку» из шага 3:

  • Попытка запустить метод down первоначальной миграции (то есть возврат к пустой базе данных) в локальной базе данных может завершиться неудачей, так как при миграции будет предпринята попытка удалить индексы и ограничения внешнего ключа с использованием неверных имен. Это повлияет только на локальную базу данных, так как другие базы данных будут создаваться с нуля с помощью метода первоначальной миграции.
    Если вы хотите понизить уровень существующей локальной базы данных до пустого состояния, проще всего сделать это вручную, удалив базу данных или удалив все таблицы. После первоначального перехода все объекты базы данных будут созданы заново с именами по умолчанию, поэтому эта проблема не будет представлена повторно.
  • Если будущие изменения в модели нуждаются в изменении или удалении одного из объектов базы данных, названных по-другому, это не будет работать для существующей локальной базы данных, так как имена не будут соответствовать значениям по умолчанию. Однако он будет работать с базами данных, созданными «с нуля», так как они будут использовать имена по умолчанию, выбранные при миграции.
    Можно либо вручную внести эти изменения в локальную существующую базу данных, либо рассмотреть возможность повторного создания базы данных с нуля, так как она будет создана на других компьютерах.
  • Базы данных, созданные с помощью метода up начальной миграции, могут немного отличаться от локальной базы данных, так как будут использоваться вычисляемые имена по умолчанию для индексов и ограничения внешнего ключа. Кроме того, можно получить дополнительные индексы, так как миграция будет создавать индексы внешних ключевых столбцов по умолчанию — это может быть не так в исходной локальной базе данных.

Не все объекты базы данных представлены в модели

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

Ниже приведены некоторые примеры того, когда необходимо помнить об этом.

  • Независимо от варианта, выбранного на шаге 3, если будущие изменения в модели нуждаются в изменении или удалении этих дополнительных объектов, миграция не будет затруднить внесение этих изменений. Например, если удалить столбец с дополнительным индексом, то при миграции не будет известно, что он удаляет индекс. Его необходимо будет добавить в шаблон миграции вручную.
  • При использовании параметра «вариант 2: использовать пустую базу данных в качестве начальной точки» эти дополнительные объекты не будут созданы методом первоначальной миграции.
    При необходимости вы можете изменить методы up и Down, чтобы позаботиться об этих дополнительных объектах. для объектов, которые изначально не поддерживаются в API-интерфейсе миграции (например, представления), можно использовать метод Sql для запуска необработанных SQL для их создания или удаления.

Советы и приёмы¶

Создание пользовательских первичных ключей

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

<?php
use Migrations\AbstractMigration;

class CreateProductsTable extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('products', 'id' => false, 'primary_key' => 'id']]);
        $table
              ->addColumn('id', 'uuid')
              ->addColumn('name', 'string')
              ->addColumn('description', 'text')
              ->create();
    }
}

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

Примечание

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

$ bincake bake migration CreateProducts iduuidprimary namestring descriptiontext created modified

Кроме того, начиная с Migrations 1.3 был введён новый способ обработки
первичного ключа. Для этого ваш класс миграции должен расширить новый
класс .

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

<?php
use Migrations\AbstractMigration;

class CreateProductsTable extends AbstractMigration
{

    public $autoId = false;

    public function up()
    {
        $table = $this->table('products');
        $table
            ->addColumn('id', 'integer', 
                'autoIncrement' => true,
                'limit' => 11
            ])
            ->addPrimaryKey('id')
            ->addColumn('name', 'string')
            ->addColumn('description', 'text')
            ->create();
    }
}

По сравнению с предыдущим способом работы с первичным ключом, этот метод даёт
вам возможность больше контролировать определение столбца первичного ключа:
unsigned или not, limit, comment и т.д.

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

Предупреждение

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

Параметры сортировки

Если вам нужно создать таблицу с другой сортировкой, чем стандартная по
умолчанию, вы можете определить её с помощью метода в качестве
опции:

<?php
use Migrations\AbstractMigration;

class CreateCategoriesTable extends AbstractMigration
{
    public function change()
    {
        $table = $this
            ->table('categories', 
                'collation' => 'latin1_german1_ci'
            ])
            ->addColumn('title', 'string', 
                'default' => null,
                'limit' => 255,
                'null' => false,
            ])
            ->create();
    }
}

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

Обновление имени столбцов и использование объектов Table

Если вы используете объект CakePHP ORM Table для управления значениями из
своей базы данных вместе с переименованием или удалением столбца, убедитесь,
что вы создали новый экземпляр объекта Table после вызова .
Реестр объектов таблицы очищается после вызова , чтобы обновить
схему, которая отражается и хранится в объекте Table при создании экземпляра.

Миграции и развёртывание

Если вы используете плагин при развёртывании приложения, обязательно очистите
кэш ORM, чтобы он обновил метаданные столбца ваших таблиц. В противном случае
вы можете столкнуться с ошибками в отношении столбцов, которые не существуют
при выполнении операций над этими новыми столбцами.
Ядро CakePHP включает Schema Cache Shell
который вы можете использовать для выполнения этой операции:

$ bincake schema_cache clear

Обязательно прочитайте раздел Schema Cache Shell,
если вы хотите узнать больше об этой оболочке.

Переименование таблицы

Плагин даёт вам возможность переименовать таблицу, используя метод .
В файле миграции вы можете сделать следующее:

public function up()
{
    $this->table('old_table_name')
        ->rename('new_table_name');
}

Пропуск генерации файла

Добавлено в версии cakephp/migrations: 1.6.5

Для того, чтобы функция diff работала, каждый раз, когда вы переносите,
откатываете или выпекаете снимок, создается файл .Lock, чтобы отслеживать
состояние вашей схемы базы данных в любой момент времени. Вы можете пропустить
создание этого файла, например, при развёртывании в рабочей среде, используя
опцию для вышеупомянутой команды:

$ bincake migrations migrate --no-lock

$ bincake migrations rollback --no-lock

$ bincake bake migration_snapshot MyMigration --no-lock

Что нужно знать перед началом работы

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

  • Сервер Exchange 2010 должен работать под управлением Exchange 2010 с пакетом обновления 3 (SP3) и накопительным пакетом обновления 8 (RU8) или более поздних версий.

  • Сервер Exchange 2007 должен работать под управлением Exchange 2007 с пакетом обновления 3 (SP3) и накопительным пакетом обновления 15 (RU15) или более поздних версий.

  • Максимальное число общедоступных папок, которые могут быть перенесены в Exchange 2013 г. за одну миграцию, составляет 500 000.

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

  • В Exchange 2010 вам необходимо быть членом группы ролей RBAC «Управление организацией» или «Управление сервером». Дополнительные сведения см. в статье Добавление участников в группу роли.

  • В Exchange 2007 вам необходима роль администратора организации Exchange или администратора сервера Exchange Server. Кроме того, вам необходима роль администратора общедоступных папок, а также вы должны входить в локальную группу администраторов целевого сервера. Дополнительные сведения см. в статье Инструкции по добавлению пользователя или группы в роль администратора.

  • При работе с сервером Exchange 2007 необходимо выполнить обновление до Windows PowerShell 2.0 и WinRM 2.0 для 64-разрядного выпуска Windows Server 2008.

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

  • Перед переносом переместите все почтовые ящики пользователей в Exchange 2013 г., так как пользователи с Exchange или Exchange 2010 г. не будут иметь доступа к общедоступным папок Exchange 2013 г. Подробные сведения см. в материале «Перемещение почтового ящика в Exchange 2013 г.».

  • В среде с несколькими доменами общедоступные папки с поддержкой почты перестанут работать после переноса на Exchange 2013 г., если Exchange в детском домене. Это потому, что Exchange 2013 г. объекты общедоступных папок с поддержкой почты должны быть под корневым доменом. Чтобы устранить эту проблему, необходимо отключить общедоступные папки с включенной почтой, а затем снова включить их, что позволит переместить их в правильное расположение домена.

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

  • Для переноса всех общедоступных данных папок необходимо использовать одну партию миграции. Exchange позволяет создавать только одну партию миграции одновременно. Если вы попытайтесь создать несколько пакетов миграции одновременно, в результате будет допущена ошибка.

  • Сочетания клавиш для процедур, описанных в этой статье, приведены в статье Сочетания клавиш в Центре администрирования Exchange.

Важно!

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

Настройте начальную миграцию сразу после запуска приложений

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

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

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

Что ж, мы покажем вам, как именно это сделать.

Создание метода расширения

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

Теперь нам нужно установить библиотеку Microsoft.ASPNetCore.Hosting.Abstractions (она нужна нам для типа IHost, который мы собираемся использовать в нашем методе расширения) и добавить метод расширения для этого класса:

Мы используем тип , потому что это позволяет нам связать этот метод в файле и, конечно же, как вы можете видеть, он нам нужен для основной логики. .

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

Применение метода MigrateDatabase

Следующим шагом является вызов этого метода в классе :

Наконец, давайте удалим таблицы Student и _EFMigrationsHistory из базы данных и удалим хранимую процедуру в папке Programmability, чтобы имитировать пустую базу данных (или просто отбросим вашу базу данных: D). Затем мы можем запустить наше приложение. Мы увидим журналы в окне консоли, которые сообщают нам, что миграции выполняются. После того, как миграции завершили свою работу, мы можем проверить базу данных, чтобы убедиться, что все таблицы и процедуры были созданы снова.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: