На этой стадии оба проекта компилируются и все готово к созданию еще одной миграции для обновления базы данных. Введите в каталоге проекта AutoLot.Dal следующие команды (каждая команда должна вводиться в одной строке):

dotnet ef migrations add UpdatedEntities -o EfStructures\Migrations

 -c AutoLot.Dal.EfStructures.ApplicationDbContext

dotnet ef database update UpdatedEntities

 -c AutoLot.Dal.EfStructures.ApplicationDbContext

<p id="AutBody_Root983"><strong>Добавление представления базы данных и хранимой процедуры</strong></p>

 Осталось внести в базу данных два изменения: создать хранимую процедуру GetPetName, рассмотренную в главе 21, и добавить представление базы данных, которое объединяет таблицу Orders с деталями Customer, Car и Make.

<p id="AutBody_Root984"><strong>Добавление класса MigrationHelpers</strong></p>

Хранимая процедура и представление будут создаваться с использованием миграции, которая требует написания кода вручную. Причина поступать так (вместо того, чтобы просто открыть Azure Data Studio и запустить код T-SQL) — желание поместить полное конфигурирование базы данных в один процесс. Когда все содержится в миграциях, единственный вызов dotnet ef database update гарантирует, что база данных является актуальной, включая конфигурацию EF Core и специальный код SQL.

Выполнение команды the dotnet ef migrations add при отсутствии изменений в модели все равно приводит к созданию файлов миграции, имеющих правильную отметку времени, с пустыми методами Up и Down. Введите показанную ниже команду для создания пустой миграции (но не применения миграции):

dotnet ef migrations add SQL -o EfStructures\Migrations

 -c AutoLot.Dal.EfStructures.ApplicationDbContext

Создайте в каталоге EfStructures проекта AutoLot.Dal новый файл по имени MigrationHelpers.cs. Добавьте оператор using для пространства имен Microsoft.EntityFrameworkCore.Migrations, сделайте класс открытым и статическим и поместите в него следующие методы, которые используют MigrationBuilder для запуска операторов SQL в отношении базы данных:

namespace AutoLot.Dal.EfStructures

{

  public static class MigrationHelpers

  {

    public static void CreateSproc(MigrationBuilder migrationBuilder)

    {

      migrationBuilder.Sql($@"

          exec (N'

          CREATE PROCEDURE [dbo].[GetPetName]

              @carID int,

              @petName nvarchar(50) output

          AS

          SELECT @petName = PetName from dbo.Inventory where Id = @carID

      ')");

    }

    public static void DropSproc(MigrationBuilder migrationBuilder)

    {

      migrationBuilder.Sql("DROP PROCEDURE [dbo].[GetPetName]");

    }

    public static void CreateCustomerOrderView(

      MigrationBuilder migrationBuilder)

    {

      migrationBuilder.Sql($@"

          exec (N'

          CREATE VIEW [dbo].[CustomerOrderView]

          AS

      SELECT dbo.Customers.FirstName, dbo.Customers.LastName,

             dbo.Inventory.Color, dbo.Inventory.PetName,

             dbo.Inventory.IsDrivable,

             dbo.Makes.Name AS Make

          FROM dbo.Orders

          INNER JOIN dbo.Customers ON dbo.Orders.CustomerId = dbo.Customers.Id

          INNER JOIN dbo.Inventory ON dbo.Orders.CarId = dbo.Inventory.Id

          INNER JOIN dbo.Makes ON dbo.Makes.Id = dbo.Inventory.MakeId

      ')");

    }

    public static void DropCustomerOrderView(MigrationBuilder migrationBuilder)

    {

      migrationBuilder.Sql("EXEC (N' DROP VIEW [dbo].[CustomerOrderView] ')");

    }

  }

}

<p id="AutBody_Root985"><strong>Обновление и применение миграции</strong></p>
Перейти на страницу:

Похожие книги