Создайте в каталоге 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] ')");
}
}
}
Обновление и применение миграции
Для каждого объекта 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);
}