diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/20260526081556_V2HostingAlignment.Designer.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/20260526081556_V2HostingAlignment.Designer.cs new file mode 100644 index 0000000..7b1008c --- /dev/null +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/20260526081556_V2HostingAlignment.Designer.cs @@ -0,0 +1,1744 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ZB.MOM.WW.OtOpcUa.Configuration; + +#nullable disable + +namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations +{ + [DbContext(typeof(OtOpcUaConfigDbContext))] + [Migration("20260526081556_V2HostingAlignment")] + partial class V2HostingAlignment + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("nvarchar(max)"); + + b.Property("Xml") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", b => + { + b.Property("NodeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ApplicationUri") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("DashboardPort") + .HasColumnType("int"); + + b.Property("DriverConfigOverridesJson") + .HasColumnType("nvarchar(max)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Host") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("LastSeenAt") + .HasColumnType("datetime2(3)"); + + b.Property("OpcUaPort") + .HasColumnType("int"); + + b.Property("ServiceLevelBase") + .HasColumnType("tinyint"); + + b.HasKey("NodeId"); + + b.HasIndex("ApplicationUri") + .IsUnique() + .HasDatabaseName("UX_ClusterNode_ApplicationUri"); + + b.HasIndex("ClusterId") + .HasDatabaseName("IX_ClusterNode_ClusterId"); + + b.ToTable("ClusterNode", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNodeCredential", b => + { + b.Property("CredentialId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Kind") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("NodeId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RotatedAt") + .HasColumnType("datetime2(3)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.HasKey("CredentialId"); + + b.HasIndex("Kind", "Value") + .IsUnique() + .HasDatabaseName("UX_ClusterNodeCredential_Value") + .HasFilter("[Enabled] = 1"); + + b.HasIndex("NodeId", "Enabled") + .HasDatabaseName("IX_ClusterNodeCredential_NodeId"); + + b.ToTable("ClusterNodeCredential", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigAuditLog", b => + { + b.Property("AuditId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("AuditId")); + + b.Property("ClusterId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DetailsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("EventType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("GenerationId") + .HasColumnType("bigint"); + + b.Property("NodeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Principal") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Timestamp") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.HasKey("AuditId"); + + b.HasIndex("GenerationId") + .HasDatabaseName("IX_ConfigAuditLog_Generation") + .HasFilter("[GenerationId] IS NOT NULL"); + + b.HasIndex("ClusterId", "Timestamp") + .IsDescending(false, true) + .HasDatabaseName("IX_ConfigAuditLog_Cluster_Time"); + + b.ToTable("ConfigAuditLog", null, t => + { + t.HasCheckConstraint("CK_ConfigAuditLog_DetailsJson_IsJson", "DetailsJson IS NULL OR ISJSON(DetailsJson) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigEdit", b => + { + b.Property("EditId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("EditedAtUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("EditedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("EntityId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityType") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ExecutionId") + .HasColumnType("uniqueidentifier"); + + b.Property("FieldsJson") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SourceNode") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("EditId"); + + b.HasIndex("EditedAtUtc") + .HasDatabaseName("IX_ConfigEdit_EditedAt"); + + b.HasIndex("ExecutionId") + .HasDatabaseName("IX_ConfigEdit_Execution") + .HasFilter("[ExecutionId] IS NOT NULL"); + + b.HasIndex("EntityType", "EntityId") + .HasDatabaseName("IX_ConfigEdit_Entity"); + + b.ToTable("ConfigEdit", null, t => + { + t.HasCheckConstraint("CK_ConfigEdit_FieldsJson_IsJson", "ISJSON(FieldsJson) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Deployment", b => + { + b.Property("DeploymentId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ArtifactBlob") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("CreatedAtUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("FailureReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("RevisionHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("SealedAtUtc") + .HasColumnType("datetime2(3)"); + + b.Property("Status") + .HasColumnType("int"); + + b.HasKey("DeploymentId"); + + b.HasIndex("CreatedAtUtc") + .HasDatabaseName("IX_Deployment_CreatedAt"); + + b.HasIndex("Status") + .HasDatabaseName("IX_Deployment_Status"); + + b.ToTable("Deployment", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Device", b => + { + b.Property("DeviceRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("DeviceConfig") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DeviceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DriverInstanceId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.HasKey("DeviceRowId"); + + b.HasIndex("DeviceId") + .IsUnique() + .HasDatabaseName("UX_Device_LogicalId") + .HasFilter("[DeviceId] IS NOT NULL"); + + b.HasIndex("DriverInstanceId") + .HasDatabaseName("IX_Device_Driver"); + + b.ToTable("Device", null, t => + { + t.HasCheckConstraint("CK_Device_DeviceConfig_IsJson", "ISJSON(DeviceConfig) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.DriverHostStatus", b => + { + b.Property("NodeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DriverInstanceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("HostName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Detail") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("LastSeenUtc") + .HasColumnType("datetime2(3)"); + + b.Property("State") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("StateChangedUtc") + .HasColumnType("datetime2(3)"); + + b.HasKey("NodeId", "DriverInstanceId", "HostName"); + + b.HasIndex("LastSeenUtc") + .HasDatabaseName("IX_DriverHostStatus_LastSeen"); + + b.HasIndex("NodeId") + .HasDatabaseName("IX_DriverHostStatus_Node"); + + b.ToTable("DriverHostStatus", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.DriverInstance", b => + { + b.Property("DriverInstanceRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DriverConfig") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("DriverInstanceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DriverType") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("NamespaceId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ResilienceConfig") + .HasColumnType("nvarchar(max)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.HasKey("DriverInstanceRowId"); + + b.HasIndex("ClusterId") + .HasDatabaseName("IX_DriverInstance_Cluster"); + + b.HasIndex("DriverInstanceId") + .IsUnique() + .HasDatabaseName("UX_DriverInstance_LogicalId") + .HasFilter("[DriverInstanceId] IS NOT NULL"); + + b.HasIndex("NamespaceId") + .HasDatabaseName("IX_DriverInstance_Namespace"); + + b.ToTable("DriverInstance", null, t => + { + t.HasCheckConstraint("CK_DriverInstance_DriverConfig_IsJson", "ISJSON(DriverConfig) = 1"); + + t.HasCheckConstraint("CK_DriverInstance_ResilienceConfig_IsJson", "ResilienceConfig IS NULL OR ISJSON(ResilienceConfig) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.DriverInstanceResilienceStatus", b => + { + b.Property("DriverInstanceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("HostName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("BaselineFootprintBytes") + .HasColumnType("bigint"); + + b.Property("ConsecutiveFailures") + .HasColumnType("int"); + + b.Property("CurrentBulkheadDepth") + .HasColumnType("int"); + + b.Property("CurrentFootprintBytes") + .HasColumnType("bigint"); + + b.Property("LastCircuitBreakerOpenUtc") + .HasColumnType("datetime2(3)"); + + b.Property("LastRecycleUtc") + .HasColumnType("datetime2(3)"); + + b.Property("LastSampledUtc") + .HasColumnType("datetime2(3)"); + + b.HasKey("DriverInstanceId", "HostName"); + + b.HasIndex("LastSampledUtc") + .HasDatabaseName("IX_DriverResilience_LastSampled"); + + b.ToTable("DriverInstanceResilienceStatus", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Equipment", b => + { + b.Property("EquipmentRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("AssetLocation") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("DeviceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeviceManualUri") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("DriverInstanceId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("EquipmentClassRef") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("EquipmentId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EquipmentUuid") + .HasColumnType("uniqueidentifier"); + + b.Property("HardwareRevision") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("MachineCode") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Manufacturer") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ManufacturerUri") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("Model") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("SAPID") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("SerialNumber") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("SoftwareRevision") + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("UnsLineId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("YearOfConstruction") + .HasColumnType("smallint"); + + b.Property("ZTag") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("EquipmentRowId"); + + b.HasIndex("DriverInstanceId") + .HasDatabaseName("IX_Equipment_Driver"); + + b.HasIndex("EquipmentId") + .IsUnique() + .HasDatabaseName("UX_Equipment_LogicalId") + .HasFilter("[EquipmentId] IS NOT NULL"); + + b.HasIndex("EquipmentUuid") + .IsUnique() + .HasDatabaseName("UX_Equipment_Uuid"); + + b.HasIndex("MachineCode") + .HasDatabaseName("IX_Equipment_MachineCode"); + + b.HasIndex("SAPID") + .HasDatabaseName("IX_Equipment_SAPID") + .HasFilter("[SAPID] IS NOT NULL"); + + b.HasIndex("UnsLineId") + .HasDatabaseName("IX_Equipment_Line"); + + b.HasIndex("ZTag") + .HasDatabaseName("IX_Equipment_ZTag") + .HasFilter("[ZTag] IS NOT NULL"); + + b.HasIndex("UnsLineId", "Name") + .IsUnique() + .HasDatabaseName("UX_Equipment_LinePath"); + + b.ToTable("Equipment", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportBatch", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedAtUtc") + .HasColumnType("datetime2(3)"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("FinalisedAtUtc") + .HasColumnType("datetime2(3)"); + + b.Property("RowsAccepted") + .HasColumnType("int"); + + b.Property("RowsRejected") + .HasColumnType("int"); + + b.Property("RowsStaged") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CreatedBy", "FinalisedAtUtc") + .HasDatabaseName("IX_EquipmentImportBatch_Creator_Finalised"); + + b.ToTable("EquipmentImportBatch", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportRow", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AssetLocation") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("BatchId") + .HasColumnType("uniqueidentifier"); + + b.Property("DeviceManualUri") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("EquipmentId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EquipmentUuid") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("HardwareRevision") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("LineNumberInFile") + .HasColumnType("int"); + + b.Property("MachineCode") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Manufacturer") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ManufacturerUri") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("Model") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RejectReason") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("SAPID") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("SerialNumber") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("SoftwareRevision") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UnsAreaName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UnsLineName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("YearOfConstruction") + .HasMaxLength(8) + .HasColumnType("nvarchar(8)"); + + b.Property("ZTag") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("BatchId") + .HasDatabaseName("IX_EquipmentImportRow_Batch"); + + b.ToTable("EquipmentImportRow", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ExternalIdReservation", b => + { + b.Property("ReservationId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EquipmentUuid") + .HasColumnType("uniqueidentifier"); + + b.Property("FirstPublishedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("FirstPublishedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Kind") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("LastPublishedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("ReleaseReason") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ReleasedAt") + .HasColumnType("datetime2(3)"); + + b.Property("ReleasedBy") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("ReservationId"); + + b.HasIndex("EquipmentUuid") + .HasDatabaseName("IX_ExternalIdReservation_Equipment"); + + b.HasIndex("Kind", "Value") + .IsUnique() + .HasDatabaseName("UX_ExternalIdReservation_KindValue_Active") + .HasFilter("[ReleasedAt] IS NULL"); + + b.ToTable("ExternalIdReservation", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.LdapGroupRoleMapping", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClusterId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedAtUtc") + .HasColumnType("datetime2(3)"); + + b.Property("IsSystemWide") + .HasColumnType("bit"); + + b.Property("LdapGroup") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("Notes") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("Role") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.HasKey("Id"); + + b.HasIndex("ClusterId"); + + b.HasIndex("LdapGroup") + .HasDatabaseName("IX_LdapGroupRoleMapping_Group"); + + b.HasIndex("LdapGroup", "ClusterId") + .IsUnique() + .HasDatabaseName("UX_LdapGroupRoleMapping_Group_Cluster") + .HasFilter("[ClusterId] IS NOT NULL"); + + b.ToTable("LdapGroupRoleMapping", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Namespace", b => + { + b.Property("NamespaceRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Kind") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("NamespaceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("NamespaceUri") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Notes") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.HasKey("NamespaceRowId"); + + b.HasIndex("ClusterId") + .HasDatabaseName("IX_Namespace_Cluster"); + + b.HasIndex("NamespaceId") + .IsUnique() + .HasDatabaseName("UX_Namespace_LogicalId") + .HasFilter("[NamespaceId] IS NOT NULL"); + + b.HasIndex("NamespaceUri") + .IsUnique() + .HasDatabaseName("UX_Namespace_NamespaceUri"); + + b.HasIndex("ClusterId", "Kind") + .IsUnique() + .HasDatabaseName("UX_Namespace_Cluster_Kind"); + + b.ToTable("Namespace", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.NodeAcl", b => + { + b.Property("NodeAclRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("LdapGroup") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NodeAclId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Notes") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("PermissionFlags") + .HasColumnType("int"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("ScopeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ScopeKind") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.HasKey("NodeAclRowId"); + + b.HasIndex("ClusterId") + .HasDatabaseName("IX_NodeAcl_Cluster"); + + b.HasIndex("LdapGroup") + .HasDatabaseName("IX_NodeAcl_Group"); + + b.HasIndex("NodeAclId") + .IsUnique() + .HasDatabaseName("UX_NodeAcl_LogicalId") + .HasFilter("[NodeAclId] IS NOT NULL"); + + b.HasIndex("ScopeKind", "ScopeId") + .HasDatabaseName("IX_NodeAcl_Scope") + .HasFilter("[ScopeId] IS NOT NULL"); + + b.HasIndex("ClusterId", "LdapGroup", "ScopeKind", "ScopeId") + .IsUnique() + .HasDatabaseName("UX_NodeAcl_GroupScope") + .HasFilter("[ScopeId] IS NOT NULL"); + + b.ToTable("NodeAcl", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.NodeDeploymentState", b => + { + b.Property("NodeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeploymentId") + .HasColumnType("uniqueidentifier"); + + b.Property("AppliedAtUtc") + .HasColumnType("datetime2(3)"); + + b.Property("FailureReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("StartedAtUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("Status") + .HasColumnType("int"); + + b.HasKey("NodeId", "DeploymentId"); + + b.HasIndex("DeploymentId") + .HasDatabaseName("IX_NodeDeploymentState_Deployment"); + + b.HasIndex("Status") + .HasDatabaseName("IX_NodeDeploymentState_Status"); + + b.ToTable("NodeDeploymentState", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.PollGroup", b => + { + b.Property("PollGroupRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("DriverInstanceId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("IntervalMs") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PollGroupId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.HasKey("PollGroupRowId"); + + b.HasIndex("DriverInstanceId") + .HasDatabaseName("IX_PollGroup_Driver"); + + b.HasIndex("PollGroupId") + .IsUnique() + .HasDatabaseName("UX_PollGroup_LogicalId") + .HasFilter("[PollGroupId] IS NOT NULL"); + + b.ToTable("PollGroup", null, t => + { + t.HasCheckConstraint("CK_PollGroup_IntervalMs_Min", "IntervalMs >= 50"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Script", b => + { + b.Property("ScriptRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("Language") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("ScriptId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("SourceCode") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SourceHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("ScriptRowId"); + + b.HasIndex("ScriptId") + .IsUnique() + .HasDatabaseName("UX_Script_LogicalId") + .HasFilter("[ScriptId] IS NOT NULL"); + + b.HasIndex("SourceHash") + .HasDatabaseName("IX_Script_SourceHash"); + + b.ToTable("Script", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ScriptedAlarm", b => + { + b.Property("ScriptedAlarmRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("AlarmType") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("EquipmentId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("HistorizeToAveva") + .HasColumnType("bit"); + + b.Property("MessageTemplate") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PredicateScriptId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Retain") + .HasColumnType("bit"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("ScriptedAlarmId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Severity") + .HasColumnType("int"); + + b.HasKey("ScriptedAlarmRowId"); + + b.HasIndex("PredicateScriptId") + .HasDatabaseName("IX_ScriptedAlarm_Script"); + + b.HasIndex("ScriptedAlarmId") + .IsUnique() + .HasDatabaseName("UX_ScriptedAlarm_LogicalId") + .HasFilter("[ScriptedAlarmId] IS NOT NULL"); + + b.HasIndex("EquipmentId", "Name") + .IsUnique() + .HasDatabaseName("UX_ScriptedAlarm_EquipmentPath"); + + b.ToTable("ScriptedAlarm", null, t => + { + t.HasCheckConstraint("CK_ScriptedAlarm_AlarmType", "AlarmType IN ('AlarmCondition','LimitAlarm','OffNormalAlarm','DiscreteAlarm')"); + + t.HasCheckConstraint("CK_ScriptedAlarm_Severity_Range", "Severity BETWEEN 1 AND 1000"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ScriptedAlarmState", b => + { + b.Property("ScriptedAlarmId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("AckedState") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("CommentsJson") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ConfirmedState") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("EnabledState") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("LastAckComment") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("LastAckUser") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastAckUtc") + .HasColumnType("datetime2(3)"); + + b.Property("LastConfirmComment") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("LastConfirmUser") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastConfirmUtc") + .HasColumnType("datetime2(3)"); + + b.Property("ShelvingExpiresUtc") + .HasColumnType("datetime2(3)"); + + b.Property("ShelvingState") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("UpdatedAtUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.HasKey("ScriptedAlarmId"); + + b.ToTable("ScriptedAlarmState", null, t => + { + t.HasCheckConstraint("CK_ScriptedAlarmState_CommentsJson_IsJson", "ISJSON(CommentsJson) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", b => + { + b.Property("ClusterId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreatedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("Enterprise") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2(3)"); + + b.Property("ModifiedBy") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("NodeCount") + .HasColumnType("tinyint"); + + b.Property("Notes") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RedundancyMode") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("Site") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.HasKey("ClusterId"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("UX_ServerCluster_Name"); + + b.HasIndex("Site") + .HasDatabaseName("IX_ServerCluster_Site"); + + b.ToTable("ServerCluster", null, t => + { + t.HasCheckConstraint("CK_ServerCluster_RedundancyMode_NodeCount", "((NodeCount = 1 AND RedundancyMode = 'None') OR (NodeCount = 2 AND RedundancyMode IN ('Warm', 'Hot')))"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Tag", b => + { + b.Property("TagRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("AccessLevel") + .IsRequired() + .HasMaxLength(16) + .HasColumnType("nvarchar(16)"); + + b.Property("DataType") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("DeviceId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DriverInstanceId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("EquipmentId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("FolderPath") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("PollGroupId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("TagConfig") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TagId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("WriteIdempotent") + .HasColumnType("bit"); + + b.HasKey("TagRowId"); + + b.HasIndex("EquipmentId") + .HasDatabaseName("IX_Tag_Equipment") + .HasFilter("[EquipmentId] IS NOT NULL"); + + b.HasIndex("TagId") + .IsUnique() + .HasDatabaseName("UX_Tag_LogicalId") + .HasFilter("[TagId] IS NOT NULL"); + + b.HasIndex("DriverInstanceId", "DeviceId") + .HasDatabaseName("IX_Tag_Driver_Device"); + + b.HasIndex("EquipmentId", "Name") + .IsUnique() + .HasDatabaseName("UX_Tag_EquipmentPath") + .HasFilter("[EquipmentId] IS NOT NULL"); + + b.HasIndex("DriverInstanceId", "FolderPath", "Name") + .IsUnique() + .HasDatabaseName("UX_Tag_FolderPath") + .HasFilter("[EquipmentId] IS NULL"); + + b.ToTable("Tag", null, t => + { + t.HasCheckConstraint("CK_Tag_TagConfig_IsJson", "ISJSON(TagConfig) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.UnsArea", b => + { + b.Property("UnsAreaRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ClusterId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Notes") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("UnsAreaId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("UnsAreaRowId"); + + b.HasIndex("ClusterId") + .HasDatabaseName("IX_UnsArea_Cluster"); + + b.HasIndex("UnsAreaId") + .IsUnique() + .HasDatabaseName("UX_UnsArea_LogicalId") + .HasFilter("[UnsAreaId] IS NOT NULL"); + + b.HasIndex("ClusterId", "Name") + .IsUnique() + .HasDatabaseName("UX_UnsArea_ClusterName"); + + b.ToTable("UnsArea", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.UnsLine", b => + { + b.Property("UnsLineRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Notes") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("UnsAreaId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UnsLineId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("UnsLineRowId"); + + b.HasIndex("UnsAreaId") + .HasDatabaseName("IX_UnsLine_Area"); + + b.HasIndex("UnsLineId") + .IsUnique() + .HasDatabaseName("UX_UnsLine_LogicalId") + .HasFilter("[UnsLineId] IS NOT NULL"); + + b.HasIndex("UnsAreaId", "Name") + .IsUnique() + .HasDatabaseName("UX_UnsLine_AreaName"); + + b.ToTable("UnsLine", (string)null); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.VirtualTag", b => + { + b.Property("VirtualTagRowId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ChangeTriggered") + .HasColumnType("bit"); + + b.Property("DataType") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.Property("Enabled") + .HasColumnType("bit"); + + b.Property("EquipmentId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Historize") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("ScriptId") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TimerIntervalMs") + .HasColumnType("int"); + + b.Property("VirtualTagId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("VirtualTagRowId"); + + b.HasIndex("ScriptId") + .HasDatabaseName("IX_VirtualTag_Script"); + + b.HasIndex("VirtualTagId") + .IsUnique() + .HasDatabaseName("UX_VirtualTag_LogicalId") + .HasFilter("[VirtualTagId] IS NOT NULL"); + + b.HasIndex("EquipmentId", "Name") + .IsUnique() + .HasDatabaseName("UX_VirtualTag_EquipmentPath"); + + b.ToTable("VirtualTag", null, t => + { + t.HasCheckConstraint("CK_VirtualTag_TimerInterval_Min", "TimerIntervalMs IS NULL OR TimerIntervalMs >= 50"); + + t.HasCheckConstraint("CK_VirtualTag_Trigger_AtLeastOne", "ChangeTriggered = 1 OR TimerIntervalMs IS NOT NULL"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") + .WithMany("Nodes") + .HasForeignKey("ClusterId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Cluster"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNodeCredential", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", "Node") + .WithMany("Credentials") + .HasForeignKey("NodeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Node"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.DriverInstance", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") + .WithMany() + .HasForeignKey("ClusterId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Cluster"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportRow", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportBatch", "Batch") + .WithMany("Rows") + .HasForeignKey("BatchId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Batch"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.LdapGroupRoleMapping", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") + .WithMany() + .HasForeignKey("ClusterId") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Cluster"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Namespace", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") + .WithMany("Namespaces") + .HasForeignKey("ClusterId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Cluster"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.NodeDeploymentState", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Deployment", "Deployment") + .WithMany() + .HasForeignKey("DeploymentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", "Node") + .WithMany() + .HasForeignKey("NodeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Deployment"); + + b.Navigation("Node"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.UnsArea", b => + { + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") + .WithMany() + .HasForeignKey("ClusterId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Cluster"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", b => + { + b.Navigation("Credentials"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportBatch", b => + { + b.Navigation("Rows"); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", b => + { + b.Navigation("Namespaces"); + + b.Navigation("Nodes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/20260526081556_V2HostingAlignment.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/20260526081556_V2HostingAlignment.cs new file mode 100644 index 0000000..bbbbbd6 --- /dev/null +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/20260526081556_V2HostingAlignment.cs @@ -0,0 +1,1562 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations +{ + /// + public partial class V2HostingAlignment : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Device_ConfigGeneration_GenerationId", + table: "Device"); + + migrationBuilder.DropForeignKey( + name: "FK_DriverInstance_ConfigGeneration_GenerationId", + table: "DriverInstance"); + + migrationBuilder.DropForeignKey( + name: "FK_Equipment_ConfigGeneration_GenerationId", + table: "Equipment"); + + migrationBuilder.DropForeignKey( + name: "FK_Namespace_ConfigGeneration_GenerationId", + table: "Namespace"); + + migrationBuilder.DropForeignKey( + name: "FK_NodeAcl_ConfigGeneration_GenerationId", + table: "NodeAcl"); + + migrationBuilder.DropForeignKey( + name: "FK_PollGroup_ConfigGeneration_GenerationId", + table: "PollGroup"); + + migrationBuilder.DropForeignKey( + name: "FK_Script_ConfigGeneration_GenerationId", + table: "Script"); + + migrationBuilder.DropForeignKey( + name: "FK_ScriptedAlarm_ConfigGeneration_GenerationId", + table: "ScriptedAlarm"); + + migrationBuilder.DropForeignKey( + name: "FK_Tag_ConfigGeneration_GenerationId", + table: "Tag"); + + migrationBuilder.DropForeignKey( + name: "FK_UnsArea_ConfigGeneration_GenerationId", + table: "UnsArea"); + + migrationBuilder.DropForeignKey( + name: "FK_UnsLine_ConfigGeneration_GenerationId", + table: "UnsLine"); + + migrationBuilder.DropForeignKey( + name: "FK_VirtualTag_ConfigGeneration_GenerationId", + table: "VirtualTag"); + + migrationBuilder.DropTable( + name: "ClusterNodeGenerationState"); + + migrationBuilder.DropTable( + name: "ConfigGeneration"); + + migrationBuilder.DropIndex( + name: "IX_VirtualTag_Generation_Script", + table: "VirtualTag"); + + migrationBuilder.DropIndex( + name: "UX_VirtualTag_Generation_EquipmentPath", + table: "VirtualTag"); + + migrationBuilder.DropIndex( + name: "UX_VirtualTag_Generation_LogicalId", + table: "VirtualTag"); + + migrationBuilder.DropIndex( + name: "IX_UnsLine_Generation_Area", + table: "UnsLine"); + + migrationBuilder.DropIndex( + name: "UX_UnsLine_Generation_AreaName", + table: "UnsLine"); + + migrationBuilder.DropIndex( + name: "UX_UnsLine_Generation_LogicalId", + table: "UnsLine"); + + migrationBuilder.DropIndex( + name: "IX_UnsArea_Generation_Cluster", + table: "UnsArea"); + + migrationBuilder.DropIndex( + name: "UX_UnsArea_Generation_ClusterName", + table: "UnsArea"); + + migrationBuilder.DropIndex( + name: "UX_UnsArea_Generation_LogicalId", + table: "UnsArea"); + + migrationBuilder.DropIndex( + name: "IX_Tag_Generation_Driver_Device", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "IX_Tag_Generation_Equipment", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "UX_Tag_Generation_EquipmentPath", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "UX_Tag_Generation_FolderPath", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "UX_Tag_Generation_LogicalId", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "IX_ScriptedAlarm_Generation_Script", + table: "ScriptedAlarm"); + + migrationBuilder.DropIndex( + name: "UX_ScriptedAlarm_Generation_EquipmentPath", + table: "ScriptedAlarm"); + + migrationBuilder.DropIndex( + name: "UX_ScriptedAlarm_Generation_LogicalId", + table: "ScriptedAlarm"); + + migrationBuilder.DropIndex( + name: "IX_Script_Generation_SourceHash", + table: "Script"); + + migrationBuilder.DropIndex( + name: "UX_Script_Generation_LogicalId", + table: "Script"); + + migrationBuilder.DropIndex( + name: "IX_PollGroup_Generation_Driver", + table: "PollGroup"); + + migrationBuilder.DropIndex( + name: "UX_PollGroup_Generation_LogicalId", + table: "PollGroup"); + + migrationBuilder.DropIndex( + name: "IX_NodeAcl_Generation_Cluster", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "IX_NodeAcl_Generation_Group", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "IX_NodeAcl_Generation_Scope", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "UX_NodeAcl_Generation_GroupScope", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "UX_NodeAcl_Generation_LogicalId", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "IX_Namespace_Generation_Cluster", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_Generation_Cluster_Kind", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_Generation_LogicalId", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_Generation_LogicalId_Cluster", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_Generation_NamespaceUri", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Generation_Driver", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Generation_Line", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Generation_MachineCode", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Generation_SAPID", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Generation_ZTag", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "UX_Equipment_Generation_LinePath", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "UX_Equipment_Generation_LogicalId", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "UX_Equipment_Generation_Uuid", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_DriverInstance_Generation_Cluster", + table: "DriverInstance"); + + migrationBuilder.DropIndex( + name: "IX_DriverInstance_Generation_Namespace", + table: "DriverInstance"); + + migrationBuilder.DropIndex( + name: "UX_DriverInstance_Generation_LogicalId", + table: "DriverInstance"); + + migrationBuilder.DropIndex( + name: "IX_Device_Generation_Driver", + table: "Device"); + + migrationBuilder.DropIndex( + name: "UX_Device_Generation_LogicalId", + table: "Device"); + + migrationBuilder.DropIndex( + name: "UX_ClusterNode_Primary_Per_Cluster", + table: "ClusterNode"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "VirtualTag"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "UnsLine"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "UnsArea"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "Tag"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "ScriptedAlarm"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "Script"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "PollGroup"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "NodeAcl"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "Namespace"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "Equipment"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "DriverInstance"); + + migrationBuilder.DropColumn( + name: "GenerationId", + table: "Device"); + + migrationBuilder.DropColumn( + name: "RedundancyRole", + table: "ClusterNode"); + + migrationBuilder.RenameIndex( + name: "IX_UnsArea_ClusterId", + table: "UnsArea", + newName: "IX_UnsArea_Cluster"); + + migrationBuilder.RenameIndex( + name: "IX_Namespace_ClusterId", + table: "Namespace", + newName: "IX_Namespace_Cluster"); + + migrationBuilder.RenameIndex( + name: "IX_DriverInstance_ClusterId", + table: "DriverInstance", + newName: "IX_DriverInstance_Cluster"); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "VirtualTag", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "UnsLine", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "UnsArea", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "Tag", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "ScriptedAlarm", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "Script", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "PollGroup", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "NodeAcl", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "Namespace", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "Equipment", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "DriverInstance", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.AddColumn( + name: "RowVersion", + table: "Device", + type: "rowversion", + rowVersion: true, + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.CreateTable( + name: "ConfigEdit", + columns: table => new + { + EditId = table.Column(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWSEQUENTIALID()"), + EntityType = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityId = table.Column(type: "uniqueidentifier", nullable: false), + FieldsJson = table.Column(type: "nvarchar(max)", nullable: false), + ExecutionId = table.Column(type: "uniqueidentifier", nullable: true), + EditedBy = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EditedAtUtc = table.Column(type: "datetime2(3)", nullable: false, defaultValueSql: "SYSUTCDATETIME()"), + SourceNode = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ConfigEdit", x => x.EditId); + table.CheckConstraint("CK_ConfigEdit_FieldsJson_IsJson", "ISJSON(FieldsJson) = 1"); + }); + + migrationBuilder.CreateTable( + name: "DataProtectionKeys", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + FriendlyName = table.Column(type: "nvarchar(max)", nullable: true), + Xml = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_DataProtectionKeys", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Deployment", + columns: table => new + { + DeploymentId = table.Column(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWSEQUENTIALID()"), + RevisionHash = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Status = table.Column(type: "int", nullable: false), + CreatedBy = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + CreatedAtUtc = table.Column(type: "datetime2(3)", nullable: false, defaultValueSql: "SYSUTCDATETIME()"), + ArtifactBlob = table.Column(type: "varbinary(max)", nullable: false), + RowVersion = table.Column(type: "rowversion", rowVersion: true, nullable: false), + FailureReason = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + SealedAtUtc = table.Column(type: "datetime2(3)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Deployment", x => x.DeploymentId); + }); + + migrationBuilder.CreateTable( + name: "NodeDeploymentState", + columns: table => new + { + NodeId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + DeploymentId = table.Column(type: "uniqueidentifier", nullable: false), + Status = table.Column(type: "int", nullable: false), + StartedAtUtc = table.Column(type: "datetime2(3)", nullable: false, defaultValueSql: "SYSUTCDATETIME()"), + AppliedAtUtc = table.Column(type: "datetime2(3)", nullable: true), + FailureReason = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + RowVersion = table.Column(type: "rowversion", rowVersion: true, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_NodeDeploymentState", x => new { x.NodeId, x.DeploymentId }); + table.ForeignKey( + name: "FK_NodeDeploymentState_ClusterNode_NodeId", + column: x => x.NodeId, + principalTable: "ClusterNode", + principalColumn: "NodeId", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_NodeDeploymentState_Deployment_DeploymentId", + column: x => x.DeploymentId, + principalTable: "Deployment", + principalColumn: "DeploymentId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_VirtualTag_Script", + table: "VirtualTag", + column: "ScriptId"); + + migrationBuilder.CreateIndex( + name: "UX_VirtualTag_EquipmentPath", + table: "VirtualTag", + columns: new[] { "EquipmentId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_VirtualTag_LogicalId", + table: "VirtualTag", + column: "VirtualTagId", + unique: true, + filter: "[VirtualTagId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_UnsLine_Area", + table: "UnsLine", + column: "UnsAreaId"); + + migrationBuilder.CreateIndex( + name: "UX_UnsLine_AreaName", + table: "UnsLine", + columns: new[] { "UnsAreaId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_UnsLine_LogicalId", + table: "UnsLine", + column: "UnsLineId", + unique: true, + filter: "[UnsLineId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_UnsArea_ClusterName", + table: "UnsArea", + columns: new[] { "ClusterId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_UnsArea_LogicalId", + table: "UnsArea", + column: "UnsAreaId", + unique: true, + filter: "[UnsAreaId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Tag_Driver_Device", + table: "Tag", + columns: new[] { "DriverInstanceId", "DeviceId" }); + + migrationBuilder.CreateIndex( + name: "IX_Tag_Equipment", + table: "Tag", + column: "EquipmentId", + filter: "[EquipmentId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Tag_EquipmentPath", + table: "Tag", + columns: new[] { "EquipmentId", "Name" }, + unique: true, + filter: "[EquipmentId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Tag_FolderPath", + table: "Tag", + columns: new[] { "DriverInstanceId", "FolderPath", "Name" }, + unique: true, + filter: "[EquipmentId] IS NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Tag_LogicalId", + table: "Tag", + column: "TagId", + unique: true, + filter: "[TagId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_ScriptedAlarm_Script", + table: "ScriptedAlarm", + column: "PredicateScriptId"); + + migrationBuilder.CreateIndex( + name: "UX_ScriptedAlarm_EquipmentPath", + table: "ScriptedAlarm", + columns: new[] { "EquipmentId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_ScriptedAlarm_LogicalId", + table: "ScriptedAlarm", + column: "ScriptedAlarmId", + unique: true, + filter: "[ScriptedAlarmId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Script_SourceHash", + table: "Script", + column: "SourceHash"); + + migrationBuilder.CreateIndex( + name: "UX_Script_LogicalId", + table: "Script", + column: "ScriptId", + unique: true, + filter: "[ScriptId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_PollGroup_Driver", + table: "PollGroup", + column: "DriverInstanceId"); + + migrationBuilder.CreateIndex( + name: "UX_PollGroup_LogicalId", + table: "PollGroup", + column: "PollGroupId", + unique: true, + filter: "[PollGroupId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_NodeAcl_Cluster", + table: "NodeAcl", + column: "ClusterId"); + + migrationBuilder.CreateIndex( + name: "IX_NodeAcl_Group", + table: "NodeAcl", + column: "LdapGroup"); + + migrationBuilder.CreateIndex( + name: "IX_NodeAcl_Scope", + table: "NodeAcl", + columns: new[] { "ScopeKind", "ScopeId" }, + filter: "[ScopeId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_NodeAcl_GroupScope", + table: "NodeAcl", + columns: new[] { "ClusterId", "LdapGroup", "ScopeKind", "ScopeId" }, + unique: true, + filter: "[ScopeId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_NodeAcl_LogicalId", + table: "NodeAcl", + column: "NodeAclId", + unique: true, + filter: "[NodeAclId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_Cluster_Kind", + table: "Namespace", + columns: new[] { "ClusterId", "Kind" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_LogicalId", + table: "Namespace", + column: "NamespaceId", + unique: true, + filter: "[NamespaceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_NamespaceUri", + table: "Namespace", + column: "NamespaceUri", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Driver", + table: "Equipment", + column: "DriverInstanceId"); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Line", + table: "Equipment", + column: "UnsLineId"); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_MachineCode", + table: "Equipment", + column: "MachineCode"); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_SAPID", + table: "Equipment", + column: "SAPID", + filter: "[SAPID] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_ZTag", + table: "Equipment", + column: "ZTag", + filter: "[ZTag] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Equipment_LinePath", + table: "Equipment", + columns: new[] { "UnsLineId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_Equipment_LogicalId", + table: "Equipment", + column: "EquipmentId", + unique: true, + filter: "[EquipmentId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Equipment_Uuid", + table: "Equipment", + column: "EquipmentUuid", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_DriverInstance_Namespace", + table: "DriverInstance", + column: "NamespaceId"); + + migrationBuilder.CreateIndex( + name: "UX_DriverInstance_LogicalId", + table: "DriverInstance", + column: "DriverInstanceId", + unique: true, + filter: "[DriverInstanceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Device_Driver", + table: "Device", + column: "DriverInstanceId"); + + migrationBuilder.CreateIndex( + name: "UX_Device_LogicalId", + table: "Device", + column: "DeviceId", + unique: true, + filter: "[DeviceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_ClusterNode_ClusterId", + table: "ClusterNode", + column: "ClusterId"); + + migrationBuilder.CreateIndex( + name: "IX_ConfigEdit_EditedAt", + table: "ConfigEdit", + column: "EditedAtUtc"); + + migrationBuilder.CreateIndex( + name: "IX_ConfigEdit_Entity", + table: "ConfigEdit", + columns: new[] { "EntityType", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_ConfigEdit_Execution", + table: "ConfigEdit", + column: "ExecutionId", + filter: "[ExecutionId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Deployment_CreatedAt", + table: "Deployment", + column: "CreatedAtUtc"); + + migrationBuilder.CreateIndex( + name: "IX_Deployment_Status", + table: "Deployment", + column: "Status"); + + migrationBuilder.CreateIndex( + name: "IX_NodeDeploymentState_Deployment", + table: "NodeDeploymentState", + column: "DeploymentId"); + + migrationBuilder.CreateIndex( + name: "IX_NodeDeploymentState_Status", + table: "NodeDeploymentState", + column: "Status"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ConfigEdit"); + + migrationBuilder.DropTable( + name: "DataProtectionKeys"); + + migrationBuilder.DropTable( + name: "NodeDeploymentState"); + + migrationBuilder.DropTable( + name: "Deployment"); + + migrationBuilder.DropIndex( + name: "IX_VirtualTag_Script", + table: "VirtualTag"); + + migrationBuilder.DropIndex( + name: "UX_VirtualTag_EquipmentPath", + table: "VirtualTag"); + + migrationBuilder.DropIndex( + name: "UX_VirtualTag_LogicalId", + table: "VirtualTag"); + + migrationBuilder.DropIndex( + name: "IX_UnsLine_Area", + table: "UnsLine"); + + migrationBuilder.DropIndex( + name: "UX_UnsLine_AreaName", + table: "UnsLine"); + + migrationBuilder.DropIndex( + name: "UX_UnsLine_LogicalId", + table: "UnsLine"); + + migrationBuilder.DropIndex( + name: "UX_UnsArea_ClusterName", + table: "UnsArea"); + + migrationBuilder.DropIndex( + name: "UX_UnsArea_LogicalId", + table: "UnsArea"); + + migrationBuilder.DropIndex( + name: "IX_Tag_Driver_Device", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "IX_Tag_Equipment", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "UX_Tag_EquipmentPath", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "UX_Tag_FolderPath", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "UX_Tag_LogicalId", + table: "Tag"); + + migrationBuilder.DropIndex( + name: "IX_ScriptedAlarm_Script", + table: "ScriptedAlarm"); + + migrationBuilder.DropIndex( + name: "UX_ScriptedAlarm_EquipmentPath", + table: "ScriptedAlarm"); + + migrationBuilder.DropIndex( + name: "UX_ScriptedAlarm_LogicalId", + table: "ScriptedAlarm"); + + migrationBuilder.DropIndex( + name: "IX_Script_SourceHash", + table: "Script"); + + migrationBuilder.DropIndex( + name: "UX_Script_LogicalId", + table: "Script"); + + migrationBuilder.DropIndex( + name: "IX_PollGroup_Driver", + table: "PollGroup"); + + migrationBuilder.DropIndex( + name: "UX_PollGroup_LogicalId", + table: "PollGroup"); + + migrationBuilder.DropIndex( + name: "IX_NodeAcl_Cluster", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "IX_NodeAcl_Group", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "IX_NodeAcl_Scope", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "UX_NodeAcl_GroupScope", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "UX_NodeAcl_LogicalId", + table: "NodeAcl"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_Cluster_Kind", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_LogicalId", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "UX_Namespace_NamespaceUri", + table: "Namespace"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Driver", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_Line", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_MachineCode", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_SAPID", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_Equipment_ZTag", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "UX_Equipment_LinePath", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "UX_Equipment_LogicalId", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "UX_Equipment_Uuid", + table: "Equipment"); + + migrationBuilder.DropIndex( + name: "IX_DriverInstance_Namespace", + table: "DriverInstance"); + + migrationBuilder.DropIndex( + name: "UX_DriverInstance_LogicalId", + table: "DriverInstance"); + + migrationBuilder.DropIndex( + name: "IX_Device_Driver", + table: "Device"); + + migrationBuilder.DropIndex( + name: "UX_Device_LogicalId", + table: "Device"); + + migrationBuilder.DropIndex( + name: "IX_ClusterNode_ClusterId", + table: "ClusterNode"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "VirtualTag"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "UnsLine"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "UnsArea"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "Tag"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "ScriptedAlarm"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "Script"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "PollGroup"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "NodeAcl"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "Namespace"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "Equipment"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "DriverInstance"); + + migrationBuilder.DropColumn( + name: "RowVersion", + table: "Device"); + + migrationBuilder.RenameIndex( + name: "IX_UnsArea_Cluster", + table: "UnsArea", + newName: "IX_UnsArea_ClusterId"); + + migrationBuilder.RenameIndex( + name: "IX_Namespace_Cluster", + table: "Namespace", + newName: "IX_Namespace_ClusterId"); + + migrationBuilder.RenameIndex( + name: "IX_DriverInstance_Cluster", + table: "DriverInstance", + newName: "IX_DriverInstance_ClusterId"); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "VirtualTag", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "UnsLine", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "UnsArea", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "Tag", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "ScriptedAlarm", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "Script", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "PollGroup", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "NodeAcl", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "Namespace", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "Equipment", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "DriverInstance", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "GenerationId", + table: "Device", + type: "bigint", + nullable: false, + defaultValue: 0L); + + migrationBuilder.AddColumn( + name: "RedundancyRole", + table: "ClusterNode", + type: "nvarchar(16)", + maxLength: 16, + nullable: false, + defaultValue: ""); + + migrationBuilder.CreateTable( + name: "ConfigGeneration", + columns: table => new + { + GenerationId = table.Column(type: "bigint", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ClusterId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ParentGenerationId = table.Column(type: "bigint", nullable: true), + CreatedAt = table.Column(type: "datetime2(3)", nullable: false, defaultValueSql: "SYSUTCDATETIME()"), + CreatedBy = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Notes = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true), + PublishedAt = table.Column(type: "datetime2(3)", nullable: true), + PublishedBy = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Status = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ConfigGeneration", x => x.GenerationId); + table.ForeignKey( + name: "FK_ConfigGeneration_ConfigGeneration_ParentGenerationId", + column: x => x.ParentGenerationId, + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_ConfigGeneration_ServerCluster_ClusterId", + column: x => x.ClusterId, + principalTable: "ServerCluster", + principalColumn: "ClusterId", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "ClusterNodeGenerationState", + columns: table => new + { + NodeId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + CurrentGenerationId = table.Column(type: "bigint", nullable: true), + LastAppliedAt = table.Column(type: "datetime2(3)", nullable: true), + LastAppliedError = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), + LastAppliedStatus = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + LastSeenAt = table.Column(type: "datetime2(3)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ClusterNodeGenerationState", x => x.NodeId); + table.ForeignKey( + name: "FK_ClusterNodeGenerationState_ClusterNode_NodeId", + column: x => x.NodeId, + principalTable: "ClusterNode", + principalColumn: "NodeId", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_ClusterNodeGenerationState_ConfigGeneration_CurrentGenerationId", + column: x => x.CurrentGenerationId, + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_VirtualTag_Generation_Script", + table: "VirtualTag", + columns: new[] { "GenerationId", "ScriptId" }); + + migrationBuilder.CreateIndex( + name: "UX_VirtualTag_Generation_EquipmentPath", + table: "VirtualTag", + columns: new[] { "GenerationId", "EquipmentId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_VirtualTag_Generation_LogicalId", + table: "VirtualTag", + columns: new[] { "GenerationId", "VirtualTagId" }, + unique: true, + filter: "[VirtualTagId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_UnsLine_Generation_Area", + table: "UnsLine", + columns: new[] { "GenerationId", "UnsAreaId" }); + + migrationBuilder.CreateIndex( + name: "UX_UnsLine_Generation_AreaName", + table: "UnsLine", + columns: new[] { "GenerationId", "UnsAreaId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_UnsLine_Generation_LogicalId", + table: "UnsLine", + columns: new[] { "GenerationId", "UnsLineId" }, + unique: true, + filter: "[UnsLineId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_UnsArea_Generation_Cluster", + table: "UnsArea", + columns: new[] { "GenerationId", "ClusterId" }); + + migrationBuilder.CreateIndex( + name: "UX_UnsArea_Generation_ClusterName", + table: "UnsArea", + columns: new[] { "GenerationId", "ClusterId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_UnsArea_Generation_LogicalId", + table: "UnsArea", + columns: new[] { "GenerationId", "UnsAreaId" }, + unique: true, + filter: "[UnsAreaId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Tag_Generation_Driver_Device", + table: "Tag", + columns: new[] { "GenerationId", "DriverInstanceId", "DeviceId" }); + + migrationBuilder.CreateIndex( + name: "IX_Tag_Generation_Equipment", + table: "Tag", + columns: new[] { "GenerationId", "EquipmentId" }, + filter: "[EquipmentId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Tag_Generation_EquipmentPath", + table: "Tag", + columns: new[] { "GenerationId", "EquipmentId", "Name" }, + unique: true, + filter: "[EquipmentId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Tag_Generation_FolderPath", + table: "Tag", + columns: new[] { "GenerationId", "DriverInstanceId", "FolderPath", "Name" }, + unique: true, + filter: "[EquipmentId] IS NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Tag_Generation_LogicalId", + table: "Tag", + columns: new[] { "GenerationId", "TagId" }, + unique: true, + filter: "[TagId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_ScriptedAlarm_Generation_Script", + table: "ScriptedAlarm", + columns: new[] { "GenerationId", "PredicateScriptId" }); + + migrationBuilder.CreateIndex( + name: "UX_ScriptedAlarm_Generation_EquipmentPath", + table: "ScriptedAlarm", + columns: new[] { "GenerationId", "EquipmentId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_ScriptedAlarm_Generation_LogicalId", + table: "ScriptedAlarm", + columns: new[] { "GenerationId", "ScriptedAlarmId" }, + unique: true, + filter: "[ScriptedAlarmId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Script_Generation_SourceHash", + table: "Script", + columns: new[] { "GenerationId", "SourceHash" }); + + migrationBuilder.CreateIndex( + name: "UX_Script_Generation_LogicalId", + table: "Script", + columns: new[] { "GenerationId", "ScriptId" }, + unique: true, + filter: "[ScriptId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_PollGroup_Generation_Driver", + table: "PollGroup", + columns: new[] { "GenerationId", "DriverInstanceId" }); + + migrationBuilder.CreateIndex( + name: "UX_PollGroup_Generation_LogicalId", + table: "PollGroup", + columns: new[] { "GenerationId", "PollGroupId" }, + unique: true, + filter: "[PollGroupId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_NodeAcl_Generation_Cluster", + table: "NodeAcl", + columns: new[] { "GenerationId", "ClusterId" }); + + migrationBuilder.CreateIndex( + name: "IX_NodeAcl_Generation_Group", + table: "NodeAcl", + columns: new[] { "GenerationId", "LdapGroup" }); + + migrationBuilder.CreateIndex( + name: "IX_NodeAcl_Generation_Scope", + table: "NodeAcl", + columns: new[] { "GenerationId", "ScopeKind", "ScopeId" }, + filter: "[ScopeId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_NodeAcl_Generation_GroupScope", + table: "NodeAcl", + columns: new[] { "GenerationId", "ClusterId", "LdapGroup", "ScopeKind", "ScopeId" }, + unique: true, + filter: "[ScopeId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_NodeAcl_Generation_LogicalId", + table: "NodeAcl", + columns: new[] { "GenerationId", "NodeAclId" }, + unique: true, + filter: "[NodeAclId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Namespace_Generation_Cluster", + table: "Namespace", + columns: new[] { "GenerationId", "ClusterId" }); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_Generation_Cluster_Kind", + table: "Namespace", + columns: new[] { "GenerationId", "ClusterId", "Kind" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_Generation_LogicalId", + table: "Namespace", + columns: new[] { "GenerationId", "NamespaceId" }, + unique: true, + filter: "[NamespaceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_Generation_LogicalId_Cluster", + table: "Namespace", + columns: new[] { "GenerationId", "NamespaceId", "ClusterId" }, + unique: true, + filter: "[NamespaceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Namespace_Generation_NamespaceUri", + table: "Namespace", + columns: new[] { "GenerationId", "NamespaceUri" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Generation_Driver", + table: "Equipment", + columns: new[] { "GenerationId", "DriverInstanceId" }); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Generation_Line", + table: "Equipment", + columns: new[] { "GenerationId", "UnsLineId" }); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Generation_MachineCode", + table: "Equipment", + columns: new[] { "GenerationId", "MachineCode" }); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Generation_SAPID", + table: "Equipment", + columns: new[] { "GenerationId", "SAPID" }, + filter: "[SAPID] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Equipment_Generation_ZTag", + table: "Equipment", + columns: new[] { "GenerationId", "ZTag" }, + filter: "[ZTag] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Equipment_Generation_LinePath", + table: "Equipment", + columns: new[] { "GenerationId", "UnsLineId", "Name" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "UX_Equipment_Generation_LogicalId", + table: "Equipment", + columns: new[] { "GenerationId", "EquipmentId" }, + unique: true, + filter: "[EquipmentId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_Equipment_Generation_Uuid", + table: "Equipment", + columns: new[] { "GenerationId", "EquipmentUuid" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_DriverInstance_Generation_Cluster", + table: "DriverInstance", + columns: new[] { "GenerationId", "ClusterId" }); + + migrationBuilder.CreateIndex( + name: "IX_DriverInstance_Generation_Namespace", + table: "DriverInstance", + columns: new[] { "GenerationId", "NamespaceId" }); + + migrationBuilder.CreateIndex( + name: "UX_DriverInstance_Generation_LogicalId", + table: "DriverInstance", + columns: new[] { "GenerationId", "DriverInstanceId" }, + unique: true, + filter: "[DriverInstanceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_Device_Generation_Driver", + table: "Device", + columns: new[] { "GenerationId", "DriverInstanceId" }); + + migrationBuilder.CreateIndex( + name: "UX_Device_Generation_LogicalId", + table: "Device", + columns: new[] { "GenerationId", "DeviceId" }, + unique: true, + filter: "[DeviceId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "UX_ClusterNode_Primary_Per_Cluster", + table: "ClusterNode", + column: "ClusterId", + unique: true, + filter: "[RedundancyRole] = 'Primary'"); + + migrationBuilder.CreateIndex( + name: "IX_ClusterNodeGenerationState_Generation", + table: "ClusterNodeGenerationState", + column: "CurrentGenerationId"); + + migrationBuilder.CreateIndex( + name: "IX_ConfigGeneration_Cluster_Published", + table: "ConfigGeneration", + columns: new[] { "ClusterId", "Status", "GenerationId" }, + descending: new[] { false, false, true }) + .Annotation("SqlServer:Include", new[] { "PublishedAt" }); + + migrationBuilder.CreateIndex( + name: "IX_ConfigGeneration_ParentGenerationId", + table: "ConfigGeneration", + column: "ParentGenerationId"); + + migrationBuilder.CreateIndex( + name: "UX_ConfigGeneration_Draft_Per_Cluster", + table: "ConfigGeneration", + column: "ClusterId", + unique: true, + filter: "[Status] = 'Draft'"); + + migrationBuilder.AddForeignKey( + name: "FK_Device_ConfigGeneration_GenerationId", + table: "Device", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_DriverInstance_ConfigGeneration_GenerationId", + table: "DriverInstance", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Equipment_ConfigGeneration_GenerationId", + table: "Equipment", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Namespace_ConfigGeneration_GenerationId", + table: "Namespace", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_NodeAcl_ConfigGeneration_GenerationId", + table: "NodeAcl", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_PollGroup_ConfigGeneration_GenerationId", + table: "PollGroup", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Script_ConfigGeneration_GenerationId", + table: "Script", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_ScriptedAlarm_ConfigGeneration_GenerationId", + table: "ScriptedAlarm", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Tag_ConfigGeneration_GenerationId", + table: "Tag", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_UnsArea_ConfigGeneration_GenerationId", + table: "UnsArea", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_UnsLine_ConfigGeneration_GenerationId", + table: "UnsLine", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_VirtualTag_ConfigGeneration_GenerationId", + table: "VirtualTag", + column: "GenerationId", + principalTable: "ConfigGeneration", + principalColumn: "GenerationId", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/OtOpcUaConfigDbContextModelSnapshot.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/OtOpcUaConfigDbContextModelSnapshot.cs index 7985573..4601a53 100644 --- a/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/OtOpcUaConfigDbContextModelSnapshot.cs +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Configuration/Migrations/OtOpcUaConfigDbContextModelSnapshot.cs @@ -17,11 +17,30 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "10.0.0") + .HasAnnotation("ProductVersion", "10.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("nvarchar(max)"); + + b.Property("Xml") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("DataProtectionKeys", (string)null); + }); + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", b => { b.Property("NodeId") @@ -68,11 +87,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("OpcUaPort") .HasColumnType("int"); - b.Property("RedundancyRole") - .IsRequired() - .HasMaxLength(16) - .HasColumnType("nvarchar(16)"); - b.Property("ServiceLevelBase") .HasColumnType("tinyint"); @@ -83,9 +97,7 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasDatabaseName("UX_ClusterNode_ApplicationUri"); b.HasIndex("ClusterId") - .IsUnique() - .HasDatabaseName("UX_ClusterNode_Primary_Per_Cluster") - .HasFilter("[RedundancyRole] = 'Primary'"); + .HasDatabaseName("IX_ClusterNode_ClusterId"); b.ToTable("ClusterNode", (string)null); }); @@ -141,37 +153,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.ToTable("ClusterNodeCredential", (string)null); }); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNodeGenerationState", b => - { - b.Property("NodeId") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("CurrentGenerationId") - .HasColumnType("bigint"); - - b.Property("LastAppliedAt") - .HasColumnType("datetime2(3)"); - - b.Property("LastAppliedError") - .HasMaxLength(2048) - .HasColumnType("nvarchar(2048)"); - - b.Property("LastAppliedStatus") - .HasMaxLength(16) - .HasColumnType("nvarchar(16)"); - - b.Property("LastSeenAt") - .HasColumnType("datetime2(3)"); - - b.HasKey("NodeId"); - - b.HasIndex("CurrentGenerationId") - .HasDatabaseName("IX_ClusterNodeGenerationState_Generation"); - - b.ToTable("ClusterNodeGenerationState", (string)null); - }); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigAuditLog", b => { b.Property("AuditId") @@ -225,20 +206,73 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations }); }); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", b => + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigEdit", b => { - b.Property("GenerationId") + b.Property("EditId") .ValueGeneratedOnAdd() - .HasColumnType("bigint"); + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("GenerationId")); + b.Property("EditedAtUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); - b.Property("ClusterId") + b.Property("EditedBy") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("EntityId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityType") .IsRequired() .HasMaxLength(64) .HasColumnType("nvarchar(64)"); - b.Property("CreatedAt") + b.Property("ExecutionId") + .HasColumnType("uniqueidentifier"); + + b.Property("FieldsJson") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SourceNode") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.HasKey("EditId"); + + b.HasIndex("EditedAtUtc") + .HasDatabaseName("IX_ConfigEdit_EditedAt"); + + b.HasIndex("ExecutionId") + .HasDatabaseName("IX_ConfigEdit_Execution") + .HasFilter("[ExecutionId] IS NOT NULL"); + + b.HasIndex("EntityType", "EntityId") + .HasDatabaseName("IX_ConfigEdit_Entity"); + + b.ToTable("ConfigEdit", null, t => + { + t.HasCheckConstraint("CK_ConfigEdit_FieldsJson_IsJson", "ISJSON(FieldsJson) = 1"); + }); + }); + + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Deployment", b => + { + b.Property("DeploymentId") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWSEQUENTIALID()"); + + b.Property("ArtifactBlob") + .IsRequired() + .HasColumnType("varbinary(max)"); + + b.Property("CreatedAtUtc") .ValueGeneratedOnAdd() .HasColumnType("datetime2(3)") .HasDefaultValueSql("SYSUTCDATETIME()"); @@ -248,41 +282,36 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(128) .HasColumnType("nvarchar(128)"); - b.Property("Notes") - .HasMaxLength(1024) - .HasColumnType("nvarchar(1024)"); + b.Property("FailureReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); - b.Property("ParentGenerationId") - .HasColumnType("bigint"); + b.Property("RevisionHash") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); - b.Property("PublishedAt") + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("SealedAtUtc") .HasColumnType("datetime2(3)"); - b.Property("PublishedBy") - .HasMaxLength(128) - .HasColumnType("nvarchar(128)"); + b.Property("Status") + .HasColumnType("int"); - b.Property("Status") - .IsRequired() - .HasMaxLength(16) - .HasColumnType("nvarchar(16)"); + b.HasKey("DeploymentId"); - b.HasKey("GenerationId"); + b.HasIndex("CreatedAtUtc") + .HasDatabaseName("IX_Deployment_CreatedAt"); - b.HasIndex("ClusterId") - .IsUnique() - .HasDatabaseName("UX_ConfigGeneration_Draft_Per_Cluster") - .HasFilter("[Status] = 'Draft'"); + b.HasIndex("Status") + .HasDatabaseName("IX_Deployment_Status"); - b.HasIndex("ParentGenerationId"); - - b.HasIndex("ClusterId", "Status", "GenerationId") - .IsDescending(false, false, true) - .HasDatabaseName("IX_ConfigGeneration_Cluster_Published"); - - SqlServerIndexBuilderExtensions.IncludeProperties(b.HasIndex("ClusterId", "Status", "GenerationId"), new[] { "PublishedAt" }); - - b.ToTable("ConfigGeneration", (string)null); + b.ToTable("Deployment", (string)null); }); modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Device", b => @@ -308,23 +337,26 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("Enabled") .HasColumnType("bit"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Name") .IsRequired() .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.HasKey("DeviceRowId"); - b.HasIndex("GenerationId", "DeviceId") + b.HasIndex("DeviceId") .IsUnique() - .HasDatabaseName("UX_Device_Generation_LogicalId") + .HasDatabaseName("UX_Device_LogicalId") .HasFilter("[DeviceId] IS NOT NULL"); - b.HasIndex("GenerationId", "DriverInstanceId") - .HasDatabaseName("IX_Device_Generation_Driver"); + b.HasIndex("DriverInstanceId") + .HasDatabaseName("IX_Device_Driver"); b.ToTable("Device", null, t => { @@ -400,9 +432,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("Enabled") .HasColumnType("bit"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Name") .IsRequired() .HasMaxLength(128) @@ -416,20 +445,24 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("ResilienceConfig") .HasColumnType("nvarchar(max)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.HasKey("DriverInstanceRowId"); - b.HasIndex("ClusterId"); + b.HasIndex("ClusterId") + .HasDatabaseName("IX_DriverInstance_Cluster"); - b.HasIndex("GenerationId", "ClusterId") - .HasDatabaseName("IX_DriverInstance_Generation_Cluster"); - - b.HasIndex("GenerationId", "DriverInstanceId") + b.HasIndex("DriverInstanceId") .IsUnique() - .HasDatabaseName("UX_DriverInstance_Generation_LogicalId") + .HasDatabaseName("UX_DriverInstance_LogicalId") .HasFilter("[DriverInstanceId] IS NOT NULL"); - b.HasIndex("GenerationId", "NamespaceId") - .HasDatabaseName("IX_DriverInstance_Generation_Namespace"); + b.HasIndex("NamespaceId") + .HasDatabaseName("IX_DriverInstance_Namespace"); b.ToTable("DriverInstance", null, t => { @@ -516,9 +549,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("EquipmentUuid") .HasColumnType("uniqueidentifier"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("HardwareRevision") .HasMaxLength(32) .HasColumnType("nvarchar(32)"); @@ -545,6 +575,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(32) .HasColumnType("nvarchar(32)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("SAPID") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); @@ -571,35 +607,35 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("EquipmentRowId"); - b.HasIndex("GenerationId", "DriverInstanceId") - .HasDatabaseName("IX_Equipment_Generation_Driver"); + b.HasIndex("DriverInstanceId") + .HasDatabaseName("IX_Equipment_Driver"); - b.HasIndex("GenerationId", "EquipmentId") + b.HasIndex("EquipmentId") .IsUnique() - .HasDatabaseName("UX_Equipment_Generation_LogicalId") + .HasDatabaseName("UX_Equipment_LogicalId") .HasFilter("[EquipmentId] IS NOT NULL"); - b.HasIndex("GenerationId", "EquipmentUuid") + b.HasIndex("EquipmentUuid") .IsUnique() - .HasDatabaseName("UX_Equipment_Generation_Uuid"); + .HasDatabaseName("UX_Equipment_Uuid"); - b.HasIndex("GenerationId", "MachineCode") - .HasDatabaseName("IX_Equipment_Generation_MachineCode"); + b.HasIndex("MachineCode") + .HasDatabaseName("IX_Equipment_MachineCode"); - b.HasIndex("GenerationId", "SAPID") - .HasDatabaseName("IX_Equipment_Generation_SAPID") + b.HasIndex("SAPID") + .HasDatabaseName("IX_Equipment_SAPID") .HasFilter("[SAPID] IS NOT NULL"); - b.HasIndex("GenerationId", "UnsLineId") - .HasDatabaseName("IX_Equipment_Generation_Line"); + b.HasIndex("UnsLineId") + .HasDatabaseName("IX_Equipment_Line"); - b.HasIndex("GenerationId", "ZTag") - .HasDatabaseName("IX_Equipment_Generation_ZTag") + b.HasIndex("ZTag") + .HasDatabaseName("IX_Equipment_ZTag") .HasFilter("[ZTag] IS NOT NULL"); - b.HasIndex("GenerationId", "UnsLineId", "Name") + b.HasIndex("UnsLineId", "Name") .IsUnique() - .HasDatabaseName("UX_Equipment_Generation_LinePath"); + .HasDatabaseName("UX_Equipment_LinePath"); b.ToTable("Equipment", (string)null); }); @@ -870,9 +906,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("Enabled") .HasColumnType("bit"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Kind") .IsRequired() .HasMaxLength(32) @@ -891,30 +924,29 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(1024) .HasColumnType("nvarchar(1024)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.HasKey("NamespaceRowId"); - b.HasIndex("ClusterId"); + b.HasIndex("ClusterId") + .HasDatabaseName("IX_Namespace_Cluster"); - b.HasIndex("GenerationId", "ClusterId") - .HasDatabaseName("IX_Namespace_Generation_Cluster"); - - b.HasIndex("GenerationId", "NamespaceId") + b.HasIndex("NamespaceId") .IsUnique() - .HasDatabaseName("UX_Namespace_Generation_LogicalId") + .HasDatabaseName("UX_Namespace_LogicalId") .HasFilter("[NamespaceId] IS NOT NULL"); - b.HasIndex("GenerationId", "NamespaceUri") + b.HasIndex("NamespaceUri") .IsUnique() - .HasDatabaseName("UX_Namespace_Generation_NamespaceUri"); + .HasDatabaseName("UX_Namespace_NamespaceUri"); - b.HasIndex("GenerationId", "ClusterId", "Kind") + b.HasIndex("ClusterId", "Kind") .IsUnique() - .HasDatabaseName("UX_Namespace_Generation_Cluster_Kind"); - - b.HasIndex("GenerationId", "NamespaceId", "ClusterId") - .IsUnique() - .HasDatabaseName("UX_Namespace_Generation_LogicalId_Cluster") - .HasFilter("[NamespaceId] IS NOT NULL"); + .HasDatabaseName("UX_Namespace_Cluster_Kind"); b.ToTable("Namespace", (string)null); }); @@ -931,9 +963,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("LdapGroup") .IsRequired() .HasMaxLength(256) @@ -950,6 +979,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("PermissionFlags") .HasColumnType("int"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("ScopeId") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); @@ -961,29 +996,70 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("NodeAclRowId"); - b.HasIndex("GenerationId", "ClusterId") - .HasDatabaseName("IX_NodeAcl_Generation_Cluster"); + b.HasIndex("ClusterId") + .HasDatabaseName("IX_NodeAcl_Cluster"); - b.HasIndex("GenerationId", "LdapGroup") - .HasDatabaseName("IX_NodeAcl_Generation_Group"); + b.HasIndex("LdapGroup") + .HasDatabaseName("IX_NodeAcl_Group"); - b.HasIndex("GenerationId", "NodeAclId") + b.HasIndex("NodeAclId") .IsUnique() - .HasDatabaseName("UX_NodeAcl_Generation_LogicalId") + .HasDatabaseName("UX_NodeAcl_LogicalId") .HasFilter("[NodeAclId] IS NOT NULL"); - b.HasIndex("GenerationId", "ScopeKind", "ScopeId") - .HasDatabaseName("IX_NodeAcl_Generation_Scope") + b.HasIndex("ScopeKind", "ScopeId") + .HasDatabaseName("IX_NodeAcl_Scope") .HasFilter("[ScopeId] IS NOT NULL"); - b.HasIndex("GenerationId", "ClusterId", "LdapGroup", "ScopeKind", "ScopeId") + b.HasIndex("ClusterId", "LdapGroup", "ScopeKind", "ScopeId") .IsUnique() - .HasDatabaseName("UX_NodeAcl_Generation_GroupScope") + .HasDatabaseName("UX_NodeAcl_GroupScope") .HasFilter("[ScopeId] IS NOT NULL"); b.ToTable("NodeAcl", (string)null); }); + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.NodeDeploymentState", b => + { + b.Property("NodeId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("DeploymentId") + .HasColumnType("uniqueidentifier"); + + b.Property("AppliedAtUtc") + .HasColumnType("datetime2(3)"); + + b.Property("FailureReason") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + + b.Property("StartedAtUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2(3)") + .HasDefaultValueSql("SYSUTCDATETIME()"); + + b.Property("Status") + .HasColumnType("int"); + + b.HasKey("NodeId", "DeploymentId"); + + b.HasIndex("DeploymentId") + .HasDatabaseName("IX_NodeDeploymentState_Deployment"); + + b.HasIndex("Status") + .HasDatabaseName("IX_NodeDeploymentState_Status"); + + b.ToTable("NodeDeploymentState", (string)null); + }); + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.PollGroup", b => { b.Property("PollGroupRowId") @@ -996,9 +1072,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("IntervalMs") .HasColumnType("int"); @@ -1011,14 +1084,20 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.HasKey("PollGroupRowId"); - b.HasIndex("GenerationId", "DriverInstanceId") - .HasDatabaseName("IX_PollGroup_Generation_Driver"); + b.HasIndex("DriverInstanceId") + .HasDatabaseName("IX_PollGroup_Driver"); - b.HasIndex("GenerationId", "PollGroupId") + b.HasIndex("PollGroupId") .IsUnique() - .HasDatabaseName("UX_PollGroup_Generation_LogicalId") + .HasDatabaseName("UX_PollGroup_LogicalId") .HasFilter("[PollGroupId] IS NOT NULL"); b.ToTable("PollGroup", null, t => @@ -1034,9 +1113,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasColumnType("uniqueidentifier") .HasDefaultValueSql("NEWSEQUENTIALID()"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Language") .IsRequired() .HasMaxLength(16) @@ -1047,6 +1123,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("ScriptId") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); @@ -1062,13 +1144,13 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("ScriptRowId"); - b.HasIndex("GenerationId", "ScriptId") + b.HasIndex("ScriptId") .IsUnique() - .HasDatabaseName("UX_Script_Generation_LogicalId") + .HasDatabaseName("UX_Script_LogicalId") .HasFilter("[ScriptId] IS NOT NULL"); - b.HasIndex("GenerationId", "SourceHash") - .HasDatabaseName("IX_Script_Generation_SourceHash"); + b.HasIndex("SourceHash") + .HasDatabaseName("IX_Script_SourceHash"); b.ToTable("Script", (string)null); }); @@ -1093,9 +1175,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("HistorizeToAveva") .HasColumnType("bit"); @@ -1117,6 +1196,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Property("Retain") .HasColumnType("bit"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("ScriptedAlarmId") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); @@ -1126,17 +1211,17 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("ScriptedAlarmRowId"); - b.HasIndex("GenerationId", "PredicateScriptId") - .HasDatabaseName("IX_ScriptedAlarm_Generation_Script"); + b.HasIndex("PredicateScriptId") + .HasDatabaseName("IX_ScriptedAlarm_Script"); - b.HasIndex("GenerationId", "ScriptedAlarmId") + b.HasIndex("ScriptedAlarmId") .IsUnique() - .HasDatabaseName("UX_ScriptedAlarm_Generation_LogicalId") + .HasDatabaseName("UX_ScriptedAlarm_LogicalId") .HasFilter("[ScriptedAlarmId] IS NOT NULL"); - b.HasIndex("GenerationId", "EquipmentId", "Name") + b.HasIndex("EquipmentId", "Name") .IsUnique() - .HasDatabaseName("UX_ScriptedAlarm_Generation_EquipmentPath"); + .HasDatabaseName("UX_ScriptedAlarm_EquipmentPath"); b.ToTable("ScriptedAlarm", null, t => { @@ -1316,9 +1401,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(512) .HasColumnType("nvarchar(512)"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Name") .IsRequired() .HasMaxLength(128) @@ -1328,6 +1410,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("TagConfig") .IsRequired() .HasColumnType("nvarchar(max)"); @@ -1341,26 +1429,26 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("TagRowId"); - b.HasIndex("GenerationId", "EquipmentId") - .HasDatabaseName("IX_Tag_Generation_Equipment") + b.HasIndex("EquipmentId") + .HasDatabaseName("IX_Tag_Equipment") .HasFilter("[EquipmentId] IS NOT NULL"); - b.HasIndex("GenerationId", "TagId") + b.HasIndex("TagId") .IsUnique() - .HasDatabaseName("UX_Tag_Generation_LogicalId") + .HasDatabaseName("UX_Tag_LogicalId") .HasFilter("[TagId] IS NOT NULL"); - b.HasIndex("GenerationId", "DriverInstanceId", "DeviceId") - .HasDatabaseName("IX_Tag_Generation_Driver_Device"); + b.HasIndex("DriverInstanceId", "DeviceId") + .HasDatabaseName("IX_Tag_Driver_Device"); - b.HasIndex("GenerationId", "EquipmentId", "Name") + b.HasIndex("EquipmentId", "Name") .IsUnique() - .HasDatabaseName("UX_Tag_Generation_EquipmentPath") + .HasDatabaseName("UX_Tag_EquipmentPath") .HasFilter("[EquipmentId] IS NOT NULL"); - b.HasIndex("GenerationId", "DriverInstanceId", "FolderPath", "Name") + b.HasIndex("DriverInstanceId", "FolderPath", "Name") .IsUnique() - .HasDatabaseName("UX_Tag_Generation_FolderPath") + .HasDatabaseName("UX_Tag_FolderPath") .HasFilter("[EquipmentId] IS NULL"); b.ToTable("Tag", null, t => @@ -1381,9 +1469,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Name") .IsRequired() .HasMaxLength(32) @@ -1393,25 +1478,29 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(512) .HasColumnType("nvarchar(512)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("UnsAreaId") .HasMaxLength(64) .HasColumnType("nvarchar(64)"); b.HasKey("UnsAreaRowId"); - b.HasIndex("ClusterId"); + b.HasIndex("ClusterId") + .HasDatabaseName("IX_UnsArea_Cluster"); - b.HasIndex("GenerationId", "ClusterId") - .HasDatabaseName("IX_UnsArea_Generation_Cluster"); - - b.HasIndex("GenerationId", "UnsAreaId") + b.HasIndex("UnsAreaId") .IsUnique() - .HasDatabaseName("UX_UnsArea_Generation_LogicalId") + .HasDatabaseName("UX_UnsArea_LogicalId") .HasFilter("[UnsAreaId] IS NOT NULL"); - b.HasIndex("GenerationId", "ClusterId", "Name") + b.HasIndex("ClusterId", "Name") .IsUnique() - .HasDatabaseName("UX_UnsArea_Generation_ClusterName"); + .HasDatabaseName("UX_UnsArea_ClusterName"); b.ToTable("UnsArea", (string)null); }); @@ -1423,9 +1512,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasColumnType("uniqueidentifier") .HasDefaultValueSql("NEWSEQUENTIALID()"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Name") .IsRequired() .HasMaxLength(32) @@ -1435,6 +1521,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(512) .HasColumnType("nvarchar(512)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("UnsAreaId") .IsRequired() .HasMaxLength(64) @@ -1446,17 +1538,17 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("UnsLineRowId"); - b.HasIndex("GenerationId", "UnsAreaId") - .HasDatabaseName("IX_UnsLine_Generation_Area"); + b.HasIndex("UnsAreaId") + .HasDatabaseName("IX_UnsLine_Area"); - b.HasIndex("GenerationId", "UnsLineId") + b.HasIndex("UnsLineId") .IsUnique() - .HasDatabaseName("UX_UnsLine_Generation_LogicalId") + .HasDatabaseName("UX_UnsLine_LogicalId") .HasFilter("[UnsLineId] IS NOT NULL"); - b.HasIndex("GenerationId", "UnsAreaId", "Name") + b.HasIndex("UnsAreaId", "Name") .IsUnique() - .HasDatabaseName("UX_UnsLine_Generation_AreaName"); + .HasDatabaseName("UX_UnsLine_AreaName"); b.ToTable("UnsLine", (string)null); }); @@ -1484,9 +1576,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); - b.Property("GenerationId") - .HasColumnType("bigint"); - b.Property("Historize") .HasColumnType("bit"); @@ -1495,6 +1584,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .HasMaxLength(128) .HasColumnType("nvarchar(128)"); + b.Property("RowVersion") + .IsConcurrencyToken() + .IsRequired() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("rowversion"); + b.Property("ScriptId") .IsRequired() .HasMaxLength(64) @@ -1509,17 +1604,17 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.HasKey("VirtualTagRowId"); - b.HasIndex("GenerationId", "ScriptId") - .HasDatabaseName("IX_VirtualTag_Generation_Script"); + b.HasIndex("ScriptId") + .HasDatabaseName("IX_VirtualTag_Script"); - b.HasIndex("GenerationId", "VirtualTagId") + b.HasIndex("VirtualTagId") .IsUnique() - .HasDatabaseName("UX_VirtualTag_Generation_LogicalId") + .HasDatabaseName("UX_VirtualTag_LogicalId") .HasFilter("[VirtualTagId] IS NOT NULL"); - b.HasIndex("GenerationId", "EquipmentId", "Name") + b.HasIndex("EquipmentId", "Name") .IsUnique() - .HasDatabaseName("UX_VirtualTag_Generation_EquipmentPath"); + .HasDatabaseName("UX_VirtualTag_EquipmentPath"); b.ToTable("VirtualTag", null, t => { @@ -1551,53 +1646,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations b.Navigation("Node"); }); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNodeGenerationState", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "CurrentGeneration") - .WithMany() - .HasForeignKey("CurrentGenerationId") - .OnDelete(DeleteBehavior.Restrict); - - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", "Node") - .WithOne("GenerationState") - .HasForeignKey("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNodeGenerationState", "NodeId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("CurrentGeneration"); - - b.Navigation("Node"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") - .WithMany("Generations") - .HasForeignKey("ClusterId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Parent") - .WithMany() - .HasForeignKey("ParentGenerationId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("Cluster"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Device", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); - }); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.DriverInstance", b => { b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", "Cluster") @@ -1606,26 +1654,7 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .OnDelete(DeleteBehavior.Restrict) .IsRequired(); - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - b.Navigation("Cluster"); - - b.Navigation("Generation"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Equipment", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); }); modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportRow", b => @@ -1657,70 +1686,26 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .OnDelete(DeleteBehavior.Restrict) .IsRequired(); - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - b.Navigation("Cluster"); - - b.Navigation("Generation"); }); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.NodeAcl", b => + modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.NodeDeploymentState", b => { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Deployment", "Deployment") .WithMany() - .HasForeignKey("GenerationId") + .HasForeignKey("DeploymentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", "Node") + .WithMany() + .HasForeignKey("NodeId") .OnDelete(DeleteBehavior.Restrict) .IsRequired(); - b.Navigation("Generation"); - }); + b.Navigation("Deployment"); - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.PollGroup", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Script", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ScriptedAlarm", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.Tag", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); + b.Navigation("Node"); }); modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.UnsArea", b => @@ -1731,44 +1716,12 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations .OnDelete(DeleteBehavior.Restrict) .IsRequired(); - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - b.Navigation("Cluster"); - - b.Navigation("Generation"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.UnsLine", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); - }); - - modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.VirtualTag", b => - { - b.HasOne("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ConfigGeneration", "Generation") - .WithMany() - .HasForeignKey("GenerationId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.Navigation("Generation"); }); modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ClusterNode", b => { b.Navigation("Credentials"); - - b.Navigation("GenerationState"); }); modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.EquipmentImportBatch", b => @@ -1778,8 +1731,6 @@ namespace ZB.MOM.WW.OtOpcUa.Configuration.Migrations modelBuilder.Entity("ZB.MOM.WW.OtOpcUa.Configuration.Entities.ServerCluster", b => { - b.Navigation("Generations"); - b.Navigation("Namespaces"); b.Navigation("Nodes"); diff --git a/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/SchemaComplianceTests.cs b/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/SchemaComplianceTests.cs index 9e75b2e..8ed88ce 100644 --- a/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/SchemaComplianceTests.cs +++ b/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/SchemaComplianceTests.cs @@ -23,8 +23,8 @@ public sealed class SchemaComplianceTests { var expected = new[] { - "ServerCluster", "ClusterNode", "ClusterNodeCredential", "ClusterNodeGenerationState", - "ConfigGeneration", "ConfigAuditLog", + "ServerCluster", "ClusterNode", "ClusterNodeCredential", + "ConfigAuditLog", "Namespace", "UnsArea", "UnsLine", "DriverInstance", "Device", "Equipment", "Tag", "PollGroup", "VirtualTag", "NodeAcl", "ExternalIdReservation", @@ -34,6 +34,8 @@ public sealed class SchemaComplianceTests "EquipmentImportBatch", "EquipmentImportRow", "Script", "ScriptedAlarm", "ScriptedAlarmState", + // v2 deploy-model tables (Phase 1 of Akka + fused-hosting alignment) + "Deployment", "NodeDeploymentState", "ConfigEdit", "DataProtectionKeys", }; var actual = QueryStrings(@" @@ -52,9 +54,7 @@ SELECT name FROM sys.tables WHERE name <> '__EFMigrationsHistory' ORDER BY name; // Kept here as a spec-level source of truth; the test ensures EF generated them verbatim. var expected = new[] { - ("UX_ClusterNode_Primary_Per_Cluster", "([RedundancyRole]='Primary')"), ("UX_ClusterNodeCredential_Value", "([Enabled]=(1))"), - ("UX_ConfigGeneration_Draft_Per_Cluster", "([Status]='Draft')"), ("UX_ExternalIdReservation_KindValue_Active", "([ReleasedAt] IS NULL)"), }; @@ -85,6 +85,7 @@ WHERE i.is_unique = 1 AND i.has_filter = 1;", "CK_PollGroup_IntervalMs_Min", "CK_Tag_TagConfig_IsJson", "CK_ConfigAuditLog_DetailsJson_IsJson", + "CK_ConfigEdit_FieldsJson_IsJson", }; var actual = QueryStrings("SELECT name FROM sys.check_constraints ORDER BY name;").ToHashSet(); diff --git a/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/StoredProceduresTests.cs b/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/StoredProceduresTests.cs index a3ed771..b8e6a0e 100644 --- a/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/StoredProceduresTests.cs +++ b/tests/Core/ZB.MOM.WW.OtOpcUa.Configuration.Tests/StoredProceduresTests.cs @@ -260,8 +260,8 @@ public sealed class StoredProceduresTests Exec(conn, @"INSERT dbo.ServerCluster (ClusterId, Name, Enterprise, Site, RedundancyMode, NodeCount, Enabled, CreatedBy) VALUES (@c, @c, 'zb', @s, 'None', 1, 1, SUSER_SNAME()); - INSERT dbo.ClusterNode (NodeId, ClusterId, RedundancyRole, Host, OpcUaPort, DashboardPort, ApplicationUri, ServiceLevelBase, Enabled, CreatedBy) - VALUES (@n, @c, 'Primary', 'localhost', 4840, 5001, CONCAT('urn:localhost:', @s), 200, 1, SUSER_SNAME()); + INSERT dbo.ClusterNode (NodeId, ClusterId, Host, OpcUaPort, DashboardPort, ApplicationUri, ServiceLevelBase, Enabled, CreatedBy) + VALUES (@n, @c, 'localhost', 4840, 5001, CONCAT('urn:localhost:', @s), 200, 1, SUSER_SNAME()); INSERT dbo.ClusterNodeCredential (NodeId, Kind, Value, Enabled, CreatedBy) VALUES (@n, 'SqlLogin', SUSER_SNAME(), 1, SUSER_SNAME());", ("c", clusterId), ("n", nodeId), ("s", suffix));