using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Migrations { /// /// Adds the universal ExecutionId correlation column to the centralized /// AuditLog table (#23). ExecutionId identifies the originating /// script execution / inbound request and is distinct from the per-operation /// CorrelationId. /// /// The change is purely additive: /// 1. ExecutionId uniqueidentifier NULL is added with no default, so the /// operation is a metadata-only ALTER TABLE … ADD — it does NOT /// rewrite the monthly-partitioned AuditLog table, and historical /// rows stay NULL (no backfill). /// 2. IX_AuditLog_Execution is created via raw SQL so it lands on the /// ps_AuditLog_Month(OccurredAtUtc) partition scheme, matching every /// other IX_AuditLog_* index. Keeping it partition-aligned preserves /// the partition-switch purge path (see AuditLogRepository.SwitchOutPartitionAsync). /// public partial class AddAuditLogExecutionId : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn( name: "ExecutionId", table: "AuditLog", type: "uniqueidentifier", nullable: true); // Raw SQL so the index is created on the partition scheme — EF's // CreateIndex cannot express the ON ps_AuditLog_Month(OccurredAtUtc) // clause. Mirrors IX_AuditLog_CorrelationId (filtered, aligned). migrationBuilder.Sql(@" CREATE NONCLUSTERED INDEX IX_AuditLog_Execution ON dbo.AuditLog (ExecutionId) WHERE ExecutionId IS NOT NULL ON ps_AuditLog_Month(OccurredAtUtc);"); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.Sql(@" IF EXISTS (SELECT 1 FROM sys.indexes WHERE name = 'IX_AuditLog_Execution' AND object_id = OBJECT_ID('dbo.AuditLog')) DROP INDEX IX_AuditLog_Execution ON dbo.AuditLog;"); migrationBuilder.DropColumn( name: "ExecutionId", table: "AuditLog"); } } }