< Summary

Information
Class: OzonRepositories.Migrations.ReconcileProdSchema
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Migrations/20260908110300_ReconcileProdSchema.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 82
Coverable lines: 82
Total lines: 132
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Up(...)100%210%
Down(...)100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Migrations/20260908110300_ReconcileProdSchema.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore.Infrastructure;
 2using Microsoft.EntityFrameworkCore.Migrations;
 3
 4#nullable disable
 5
 6namespace OzonRepositories.Migrations
 7{
 8    /// <summary>
 9    /// Догоняет боевую БД до baseline.
 10    ///
 11    /// Схема ST2 годами велась руками, поэтому в нескольких местах она оказалась слабее
 12    /// модели: не хватало индексов и внешних ключей, часть колонок допускала NULL,
 13    /// таймстемпы были объявлены типом TIMESTAMP. Baseline на проде только штампуется
 14    /// (таблицы там уже есть), а реальные расхождения закрывает эта миграция.
 15    ///
 16    /// Все операции идемпотентны за счёт IF EXISTS / IF NOT EXISTS (MariaDB) — на чистой
 17    /// базе, где baseline отработал полностью, миграция ничего не меняет.
 18    /// </summary>
 19    [DbContext(typeof(Context.ApplicationDbContext))]
 20    [Migration("20260908110300_ReconcileProdSchema")]
 21    public partial class ReconcileProdSchema : Migration
 22    {
 23        /// <inheritdoc />
 24        protected override void Up(MigrationBuilder migrationBuilder)
 25        {
 26            // --- Колонки, которые в БД допускали NULL, хотя данных с NULL нет ---
 027            migrationBuilder.Sql("ALTER TABLE `ExcelMappings` MODIFY COLUMN `CreatedBy` varchar(255) CHARACTER SET utf8m
 028            migrationBuilder.Sql("ALTER TABLE `FileUploadRecords` MODIFY COLUMN `Result` text CHARACTER SET utf8mb4 NOT 
 029            migrationBuilder.Sql("ALTER TABLE `PriceHistories` MODIFY COLUMN `RegistrationPrice` decimal(18,2) NOT NULL;
 30
 31            // --- StatusTransitions / StatusTransitionHistory: TIMESTAMP → datetime(6),
 32            //     беззнаковый ключ → знаковый, обязательные флаги ---
 033            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `IsActive` tinyint(1) NOT NULL DEFAULT 1
 034            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `IsRepeatable` tinyint(1) NOT NULL DEFAU
 035            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `CreatedAt` datetime(6) NOT NULL;");
 036            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `UpdatedAt` datetime(6) NULL;");
 037            migrationBuilder.Sql("ALTER TABLE `StatusTransitionHistory` MODIFY COLUMN `PerformedAt` datetime(6) NOT NULL
 038            migrationBuilder.Sql("ALTER TABLE `StatusTransitionHistory` MODIFY COLUMN `Id` bigint NOT NULL AUTO_INCREMEN
 039            migrationBuilder.Sql("ALTER TABLE `order_extensions` MODIFY COLUMN `Id` int NOT NULL AUTO_INCREMENT;");
 40
 41            // --- Индексы, которых на проде не было ---
 042            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_BitrixStockAutoSchedules_OzonClientId` ON `BitrixStockA
 043            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OrderItems_StudioOrderId` ON `OrderItems` (`StudioOrder
 044            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OrderShipmentTotals_OrderId` ON `OrderShipmentTotals` (
 045            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_Orders_EtProducerId` ON `Orders` (`EtProducerId`);");
 046            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OzonChatOrders_ChatId` ON `OzonChatOrders` (`ChatId`);"
 047            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OzonChatOrders_ChatId_OrderId` ON `OzonChatOrders` (`Ch
 048            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OzonChatOrders_IsActive_ClientId` ON `OzonChatOrders` (
 049            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OzonChatOrders_PostingNumber` ON `OzonChatOrders` (`Pos
 050            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_Products_ReplacementProductId` ON `Products` (`Replacem
 51
 52            // --- Избыточные индексы: левый префикс уже покрыт составным / уникальным ---
 053            migrationBuilder.Sql("ALTER TABLE `Orders` DROP INDEX IF EXISTS `IX_Orders_AppStatusId`;");
 054            migrationBuilder.Sql("ALTER TABLE `OrderArchives` DROP INDEX IF EXISTS `IX_OrderArchives_OrderId`;");
 55
 56            // --- Внешние ключи join-таблицы прав указывали на легаси-таблицы *V2 ---
 057            migrationBuilder.Sql("ALTER TABLE `AccessProfileDataScopeSets` DROP FOREIGN KEY IF EXISTS `FK_AccessProfileD
 058            migrationBuilder.Sql("ALTER TABLE `AccessProfileDataScopeSets` DROP FOREIGN KEY IF EXISTS `FK_AccessProfileD
 59
 60            // 59 строк OrderItems ссылались на давно удалённые заказы — с такой ссылкой
 61            // внешний ключ не создать. Сами строки сохраняем, обнуляем только ссылку.
 062            migrationBuilder.Sql(@"UPDATE `OrderItems` c
 063                LEFT JOIN `Orders` p ON p.`Id` = c.`StudioOrderId`
 064                SET c.`StudioOrderId` = NULL
 065                WHERE c.`StudioOrderId` IS NOT NULL AND p.`Id` IS NULL;");
 66
 67            // --- Внешние ключи, которых на проде не было ---
 068            migrationBuilder.Sql(@"ALTER TABLE `AccessProfileDataScopeSets`
 069                ADD CONSTRAINT `FK_AccessProfileDataScopeSets_AccessProfiles_AccessProfilesId`
 070                FOREIGN KEY IF NOT EXISTS (`AccessProfilesId`) REFERENCES `AccessProfiles` (`Id`) ON DELETE CASCADE;");
 071            migrationBuilder.Sql(@"ALTER TABLE `AccessProfileDataScopeSets`
 072                ADD CONSTRAINT `FK_AccessProfileDataScopeSets_DataScopeSets_DataScopeSetsId`
 073                FOREIGN KEY IF NOT EXISTS (`DataScopeSetsId`) REFERENCES `DataScopeSets` (`Id`) ON DELETE CASCADE;");
 074            migrationBuilder.Sql(@"ALTER TABLE `AssemblyListRunItems`
 075                ADD CONSTRAINT `FK_AssemblyListRunItems_AssemblyListRuns_RunId`
 076                FOREIGN KEY IF NOT EXISTS (`RunId`) REFERENCES `AssemblyListRuns` (`Id`) ON DELETE CASCADE;");
 077            migrationBuilder.Sql(@"ALTER TABLE `BitrixStockAutoSchedules`
 078                ADD CONSTRAINT `FK_BitrixStockAutoSchedules_OzonClients_OzonClientId`
 079                FOREIGN KEY IF NOT EXISTS (`OzonClientId`) REFERENCES `OzonClients` (`Id`) ON DELETE CASCADE;");
 080            migrationBuilder.Sql(@"ALTER TABLE `OrderItems`
 081                ADD CONSTRAINT `FK_OrderItems_Orders_StudioOrderId`
 082                FOREIGN KEY IF NOT EXISTS (`StudioOrderId`) REFERENCES `Orders` (`Id`) ON DELETE RESTRICT;");
 083            migrationBuilder.Sql(@"ALTER TABLE `Orders`
 084                ADD CONSTRAINT `FK_Orders_et_producers_EtProducerId`
 085                FOREIGN KEY IF NOT EXISTS (`EtProducerId`) REFERENCES `et_producers` (`id`) ON DELETE RESTRICT;");
 086            migrationBuilder.Sql(@"ALTER TABLE `OzonChatResponseTimes`
 087                ADD CONSTRAINT `FK_OzonChatResponseTimes_OzonClients_ClientId`
 088                FOREIGN KEY IF NOT EXISTS (`ClientId`) REFERENCES `OzonClients` (`Id`) ON DELETE CASCADE;");
 089            migrationBuilder.Sql(@"ALTER TABLE `Products`
 090                ADD CONSTRAINT `FK_Products_Products_ReplacementProductId`
 091                FOREIGN KEY IF NOT EXISTS (`ReplacementProductId`) REFERENCES `Products` (`Id`) ON DELETE RESTRICT;");
 092        }
 93
 94        /// <inheritdoc />
 95        protected override void Down(MigrationBuilder migrationBuilder)
 96        {
 097            migrationBuilder.Sql("ALTER TABLE `Products` DROP FOREIGN KEY IF EXISTS `FK_Products_Products_ReplacementPro
 098            migrationBuilder.Sql("ALTER TABLE `OzonChatResponseTimes` DROP FOREIGN KEY IF EXISTS `FK_OzonChatResponseTim
 099            migrationBuilder.Sql("ALTER TABLE `Orders` DROP FOREIGN KEY IF EXISTS `FK_Orders_et_producers_EtProducerId`;
 0100            migrationBuilder.Sql("ALTER TABLE `OrderItems` DROP FOREIGN KEY IF EXISTS `FK_OrderItems_Orders_StudioOrderI
 0101            migrationBuilder.Sql("ALTER TABLE `BitrixStockAutoSchedules` DROP FOREIGN KEY IF EXISTS `FK_BitrixStockAutoS
 0102            migrationBuilder.Sql("ALTER TABLE `AssemblyListRunItems` DROP FOREIGN KEY IF EXISTS `FK_AssemblyListRunItems
 0103            migrationBuilder.Sql("ALTER TABLE `AccessProfileDataScopeSets` DROP FOREIGN KEY IF EXISTS `FK_AccessProfileD
 0104            migrationBuilder.Sql("ALTER TABLE `AccessProfileDataScopeSets` DROP FOREIGN KEY IF EXISTS `FK_AccessProfileD
 105
 0106            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_OrderArchives_OrderId` ON `OrderArchives` (`OrderId`);"
 0107            migrationBuilder.Sql("CREATE INDEX IF NOT EXISTS `IX_Orders_AppStatusId` ON `Orders` (`AppStatusId`);");
 108
 0109            migrationBuilder.Sql("ALTER TABLE `Products` DROP INDEX IF EXISTS `IX_Products_ReplacementProductId`;");
 0110            migrationBuilder.Sql("ALTER TABLE `OzonChatOrders` DROP INDEX IF EXISTS `IX_OzonChatOrders_PostingNumber`;")
 0111            migrationBuilder.Sql("ALTER TABLE `OzonChatOrders` DROP INDEX IF EXISTS `IX_OzonChatOrders_IsActive_ClientId
 0112            migrationBuilder.Sql("ALTER TABLE `OzonChatOrders` DROP INDEX IF EXISTS `IX_OzonChatOrders_ChatId_OrderId`;"
 0113            migrationBuilder.Sql("ALTER TABLE `OzonChatOrders` DROP INDEX IF EXISTS `IX_OzonChatOrders_ChatId`;");
 0114            migrationBuilder.Sql("ALTER TABLE `Orders` DROP INDEX IF EXISTS `IX_Orders_EtProducerId`;");
 0115            migrationBuilder.Sql("ALTER TABLE `OrderShipmentTotals` DROP INDEX IF EXISTS `IX_OrderShipmentTotals_OrderId
 0116            migrationBuilder.Sql("ALTER TABLE `OrderItems` DROP INDEX IF EXISTS `IX_OrderItems_StudioOrderId`;");
 0117            migrationBuilder.Sql("ALTER TABLE `BitrixStockAutoSchedules` DROP INDEX IF EXISTS `IX_BitrixStockAutoSchedul
 118
 0119            migrationBuilder.Sql("ALTER TABLE `order_extensions` MODIFY COLUMN `Id` int unsigned NOT NULL AUTO_INCREMENT
 0120            migrationBuilder.Sql("ALTER TABLE `StatusTransitionHistory` MODIFY COLUMN `Id` bigint unsigned NOT NULL AUTO
 0121            migrationBuilder.Sql("ALTER TABLE `StatusTransitionHistory` MODIFY COLUMN `PerformedAt` timestamp NULL DEFAU
 0122            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `UpdatedAt` timestamp NULL DEFAULT NULL 
 0123            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `CreatedAt` timestamp NULL DEFAULT curre
 0124            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `IsRepeatable` tinyint(1) NULL DEFAULT 0
 0125            migrationBuilder.Sql("ALTER TABLE `StatusTransitions` MODIFY COLUMN `IsActive` tinyint(1) NULL DEFAULT 1;");
 126
 0127            migrationBuilder.Sql("ALTER TABLE `PriceHistories` MODIFY COLUMN `RegistrationPrice` decimal(18,2) NULL;");
 0128            migrationBuilder.Sql("ALTER TABLE `FileUploadRecords` MODIFY COLUMN `Result` text CHARACTER SET utf8mb4 NULL
 0129            migrationBuilder.Sql("ALTER TABLE `ExcelMappings` MODIFY COLUMN `CreatedBy` varchar(255) CHARACTER SET utf8m
 0130        }
 131    }
 132}