Создайте в каталоге 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>

Для каждого объекта SQL Server в классе MigrationHelpers имеется два метода: один создает объект, другой удаляет объект. Вспомните, что при применении миграции выполняется метод Up(), а при откате миграции — метод Down(). Вызовы статических методов создания должны попасть в метод Up() миграции, тогда как вызовы статических методов удаления — в метод Down() миграции. В результате применения миграции создаются два объекта SQL Server, которые в случае отката миграции благополучно удаляются. Ниже приведен модифицированный код миграции:

namespace AutoLot.Dal.EfStructures.Migrations

{

  public partial class SQL : Migration

  {

    protected override void Up(MigrationBuilder migrationBuilder)

    {

      MigrationHelpers.CreateSproc(migrationBuilder);

      MigrationHelpers.CreateCustomerOrderView(migrationBuilder);

    }

    protected override void Down(MigrationBuilder migrationBuilder)

    {

      MigrationHelpers.DropSproc(migrationBuilder);

      MigrationHelpers.DropCustomerOrderView(migrationBuilder);

    }

  }

}

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

dotnet ef database update -c AutoLot.Dal.EfStructures.ApplicationDbContext

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

protected override void Up(MigrationBuilder migrationBuilder)

{

// MigrationHelpers.CreateSproc(migrationBuilder);

  MigrationHelpers.CreateCustomerOrderView(migrationBuilder);

}

Перейти на страницу:

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