Язык программирования C#9 и платформа .NET5
case EntityState.Unchanged:action = e.OldState switch{EntityState.Added => "Added",EntityState.Modified => "Edited",_ => action};Console.WriteLine($"The object was {action}");break;}}Создание миграции и обновление базы данных
На этой стадии оба проекта компилируются и все готово к созданию еще одной миграции для обновления базы данных. Введите в каталоге проекта
следующие команды (каждая команда должна вводиться в одной строке):AutoLot.Daldotnet ef migrations add UpdatedEntities -o EfStructures\Migrations-c AutoLot.Dal.EfStructures.ApplicationDbContextdotnet ef database update UpdatedEntities-c AutoLot.Dal.EfStructures.ApplicationDbContextДобавление представления базы данных и хранимой процедуры
Осталось внести в базу данных два изменения: создать хранимую процедуру
, рассмотренную в главе 21, и добавить представление базы данных, которое объединяет таблицуGetPetNameс деталямиOrders,CustomerиCar.MakeДобавление класса MigrationHelpers
Хранимая процедура и представление будут создаваться с использованием миграции, которая требует написания кода вручную. Причина поступать так (вместо того, чтобы просто открыть Azure Data Studio и запустить код T-SQL) — желание поместить полное конфигурирование базы данных в один процесс. Когда все содержится в миграциях, единственный вызов
гарантирует, что база данных является актуальной, включая конфигурацию EF Core и специальный код SQL.dotnet ef database updateВыполнение команды
при отсутствии изменений в модели все равно приводит к созданию файлов миграции, имеющих правильную отметку времени, с пустыми методами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для запуска операторов SQL в отношении базы данных:MigrationBuildernamespace 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) outputASSELECT @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]ASSELECT dbo.Customers.FirstName, dbo.Customers.LastName,dbo.Inventory.Color, dbo.Inventory.PetName,dbo.Inventory.IsDrivable,dbo.Makes.Name AS MakeFROM dbo.OrdersINNER JOIN dbo.Customers ON dbo.Orders.CustomerId = dbo.Customers.IdINNER JOIN dbo.Inventory ON dbo.Orders.CarId = dbo.Inventory.IdINNER 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()миграции. В результате применения миграции создаются два объекта SQL Server, которые в случае отката миграции благополучно удаляются. Ниже приведен модифицированный код миграции:Down()