using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace CutList.Web.Migrations { /// public partial class DimensionsTPTtoTPC : Migration { private static readonly string[] DimTables = [ "DimAngle", "DimChannel", "DimFlatBar", "DimIBeam", "DimPipe", "DimRectangularTube", "DimRoundBar", "DimRoundTube", "DimSquareBar", "DimSquareTube" ]; /// protected override void Up(MigrationBuilder migrationBuilder) { // 1. Drop FKs from shape tables to DimBase foreach (var table in DimTables) { migrationBuilder.DropForeignKey( name: $"FK_{table}_DimBase_Id", table: table); } // 2. Add MaterialId column to each shape table (nullable initially) foreach (var table in DimTables) { migrationBuilder.AddColumn( name: "MaterialId", table: table, type: "int", nullable: true); } // 3. Copy MaterialId from DimBase into each shape table foreach (var table in DimTables) { migrationBuilder.Sql( $"UPDATE t SET t.MaterialId = b.MaterialId FROM [{table}] t INNER JOIN [DimBase] b ON t.Id = b.Id"); } // 4. Make MaterialId non-nullable now that data is populated foreach (var table in DimTables) { migrationBuilder.AlterColumn( name: "MaterialId", table: table, type: "int", nullable: false, oldClrType: typeof(int), oldNullable: true); } // 5. Drop DimBase migrationBuilder.DropTable(name: "DimBase"); // 6. Create shared sequence for unique IDs across all shape tables migrationBuilder.CreateSequence(name: "MaterialDimensionsSequence"); // 7. Switch Id columns to use the sequence foreach (var table in DimTables) { migrationBuilder.AlterColumn( name: "Id", table: table, type: "int", nullable: false, defaultValueSql: "NEXT VALUE FOR [MaterialDimensionsSequence]", oldClrType: typeof(int), oldType: "int"); } // 8. Create indexes and FKs for MaterialId on each shape table foreach (var table in DimTables) { migrationBuilder.CreateIndex( name: $"IX_{table}_MaterialId", table: table, column: "MaterialId", unique: true); migrationBuilder.AddForeignKey( name: $"FK_{table}_Materials_MaterialId", table: table, column: "MaterialId", principalTable: "Materials", principalColumn: "Id", onDelete: ReferentialAction.Cascade); } } /// protected override void Down(MigrationBuilder migrationBuilder) { // Drop FKs and indexes from shape tables foreach (var table in DimTables) { migrationBuilder.DropForeignKey( name: $"FK_{table}_Materials_MaterialId", table: table); migrationBuilder.DropIndex( name: $"IX_{table}_MaterialId", table: table); } // Remove sequence from Id columns foreach (var table in DimTables) { migrationBuilder.AlterColumn( name: "Id", table: table, type: "int", nullable: false, oldClrType: typeof(int), oldType: "int", oldDefaultValueSql: "NEXT VALUE FOR [MaterialDimensionsSequence]"); } migrationBuilder.DropSequence(name: "MaterialDimensionsSequence"); // Re-create DimBase migrationBuilder.CreateTable( name: "DimBase", columns: table => new { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), MaterialId = table.Column(type: "int", nullable: false) }, constraints: table => { table.PrimaryKey("PK_DimBase", x => x.Id); table.ForeignKey( name: "FK_DimBase_Materials_MaterialId", column: x => x.MaterialId, principalTable: "Materials", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( name: "IX_DimBase_MaterialId", table: "DimBase", column: "MaterialId", unique: true); // Copy data back to DimBase from all shape tables foreach (var table in DimTables) { migrationBuilder.Sql( $"SET IDENTITY_INSERT [DimBase] ON; INSERT INTO [DimBase] (Id, MaterialId) SELECT Id, MaterialId FROM [{table}]; SET IDENTITY_INSERT [DimBase] OFF;"); } // Re-add FKs from shape tables to DimBase and drop MaterialId foreach (var table in DimTables) { migrationBuilder.AddForeignKey( name: $"FK_{table}_DimBase_Id", table: table, column: "Id", principalTable: "DimBase", principalColumn: "Id", onDelete: ReferentialAction.Cascade); migrationBuilder.DropColumn(name: "MaterialId", table: table); } } } }