From 3d0c3eadbdfdf32faa84dc09b355be4116c71883 Mon Sep 17 00:00:00 2001 From: Akbar Ghasemi Tazehabadi <46082076+akghasemi@users.noreply.github.com> Date: Wed, 10 Nov 2021 16:20:33 +0100 Subject: [PATCH] Fix for oracle persistence provider (#2450) * Add support of Oracle NCLOB columns in order to use data more than 2000 char we have to use NCLOB ,in oracle we have to explicitly say the column is NCLOB otherwise it would be considered Nvarchar(2000) * remove unnecessary package source --- Nuget.Config | 4 +- .../WorkflowDefinitionConfiguration.cs | 1 + .../ElsaContext.cs | 49 ++- .../20211104093625_Update24.Designer.cs | 315 ++++++++++++++++++ .../Migrations/20211104093625_Update24.cs | 161 +++++++++ .../Migrations/ElsaContextModelSnapshot.cs | 23 +- 6 files changed, 539 insertions(+), 14 deletions(-) create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.Designer.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.cs diff --git a/Nuget.Config b/Nuget.Config index f3e5582c1..3ba31a112 100644 --- a/Nuget.Config +++ b/Nuget.Config @@ -1,8 +1,8 @@ - + - + diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/WorkflowDefinitionConfiguration.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/WorkflowDefinitionConfiguration.cs index b7cd98bc4..45c27beea 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/WorkflowDefinitionConfiguration.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/Configuration/WorkflowDefinitionConfiguration.cs @@ -23,5 +23,6 @@ namespace Elsa.Persistence.EntityFramework.Core.Configuration builder.HasIndex(x => x.IsPublished).HasDatabaseName($"IX_{nameof(WorkflowDefinition)}_{nameof(WorkflowDefinition.IsPublished)}"); builder.HasIndex(x => x.Tag).HasDatabaseName($"IX_{nameof(WorkflowDefinition)}_{nameof(WorkflowDefinition.Tag)}"); } + } } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs index c6d8e3233..d15cc647e 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Core/ElsaContext.cs @@ -1,6 +1,7 @@ -using System.Linq; +using System.Linq; using Elsa.Models; using Elsa.Persistence.EntityFramework.Core.Configuration; +using Elsa.Persistence.EntityFramework.Core.Extensions; using Microsoft.EntityFrameworkCore; using NodaTime; @@ -44,6 +45,52 @@ namespace Elsa.Persistence.EntityFramework.Core } } } + + if (Database.IsOracle()) + { + //in order to use data more than 2000 char we have to use NCLOB ,in oracle we have to explicitly say the column is NCLOB otherwise it would be considered Nvarchar(2000) + modelBuilder.Entity().Property(x => x.LastExecutedActivityId) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property("Data") + .HasColumnType("NCLOB"); + + + + modelBuilder.Entity().Property(x => x.Source) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property(x => x.Message) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property(x => x.EventName) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property(x => x.Data) + .HasColumnType("NCLOB"); + + + + + modelBuilder.Entity().Property(x => x.DisplayName) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property(x => x.Description) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property("Data") + .HasColumnType("NCLOB"); + + + + + modelBuilder.Entity().Property(x => x.Model) + .HasColumnType("NCLOB"); + + modelBuilder.Entity().Property(x => x.ModelType) + .HasColumnType("NCLOB"); + + } } } } \ No newline at end of file diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.Designer.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.Designer.cs new file mode 100644 index 000000000..e6975758e --- /dev/null +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.Designer.cs @@ -0,0 +1,315 @@ +// +using System; +using Elsa.Persistence.EntityFramework.Core; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Oracle.EntityFrameworkCore.Metadata; + +namespace Elsa.Persistence.EntityFramework.Oracle.Migrations +{ + [DbContext(typeof(ElsaContext))] + [Migration("20211104093625_Update24")] + partial class Update24 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("Elsa") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.10") + .HasAnnotation("Oracle:ValueGenerationStrategy", OracleValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Elsa.Models.Bookmark", b => + { + b.Property("Id") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("ActivityId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("ActivityType") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Hash") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Model") + .IsRequired() + .HasColumnType("NCLOB"); + + b.Property("ModelType") + .IsRequired() + .HasColumnType("NCLOB"); + + b.Property("TenantId") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId") + .HasDatabaseName("IX_Bookmark_ActivityId"); + + b.HasIndex("ActivityType") + .HasDatabaseName("IX_Bookmark_ActivityType"); + + b.HasIndex("CorrelationId") + .HasDatabaseName("IX_Bookmark_CorrelationId"); + + b.HasIndex("Hash") + .HasDatabaseName("IX_Bookmark_Hash"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_Bookmark_TenantId"); + + b.HasIndex("WorkflowInstanceId") + .HasDatabaseName("IX_Bookmark_WorkflowInstanceId"); + + b.HasIndex("ActivityType", "TenantId", "Hash") + .HasDatabaseName("IX_Bookmark_ActivityType_TenantId_Hash"); + + b.HasIndex("Hash", "CorrelationId", "TenantId") + .HasDatabaseName("IX_Bookmark_Hash_CorrelationId_TenantId"); + + b.ToTable("Bookmarks"); + }); + + modelBuilder.Entity("Elsa.Models.WorkflowDefinition", b => + { + b.Property("Id") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Data") + .HasColumnType("NCLOB"); + + b.Property("DefinitionId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("DeleteCompletedInstances") + .HasColumnType("NUMBER(1)"); + + b.Property("Description") + .HasColumnType("NCLOB"); + + b.Property("DisplayName") + .HasColumnType("NCLOB"); + + b.Property("IsLatest") + .HasColumnType("NUMBER(1)"); + + b.Property("IsPublished") + .HasColumnType("NUMBER(1)"); + + b.Property("IsSingleton") + .HasColumnType("NUMBER(1)"); + + b.Property("Name") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("PersistenceBehavior") + .HasColumnType("NUMBER(10)"); + + b.Property("Tag") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("TenantId") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Version") + .HasColumnType("NUMBER(10)"); + + b.HasKey("Id"); + + b.HasIndex("IsLatest") + .HasDatabaseName("IX_WorkflowDefinition_IsLatest"); + + b.HasIndex("IsPublished") + .HasDatabaseName("IX_WorkflowDefinition_IsPublished"); + + b.HasIndex("Name") + .HasDatabaseName("IX_WorkflowDefinition_Name"); + + b.HasIndex("Tag") + .HasDatabaseName("IX_WorkflowDefinition_Tag"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_WorkflowDefinition_TenantId"); + + b.HasIndex("Version") + .HasDatabaseName("IX_WorkflowDefinition_Version"); + + b.HasIndex("DefinitionId", "Version") + .IsUnique() + .HasDatabaseName("IX_WorkflowDefinition_DefinitionId_VersionId"); + + b.ToTable("WorkflowDefinitions"); + }); + + modelBuilder.Entity("Elsa.Models.WorkflowExecutionLogRecord", b => + { + b.Property("Id") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("ActivityId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("ActivityType") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Data") + .HasColumnType("NCLOB"); + + b.Property("EventName") + .HasColumnType("NCLOB"); + + b.Property("Message") + .HasColumnType("NCLOB"); + + b.Property("Source") + .HasColumnType("NCLOB"); + + b.Property("TenantId") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Timestamp") + .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); + + b.Property("WorkflowInstanceId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_ActivityId"); + + b.HasIndex("ActivityType") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_ActivityType"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_TenantId"); + + b.HasIndex("Timestamp") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_Timestamp"); + + b.HasIndex("WorkflowInstanceId") + .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowInstanceId"); + + b.ToTable("WorkflowExecutionLogRecords"); + }); + + modelBuilder.Entity("Elsa.Models.WorkflowInstance", b => + { + b.Property("Id") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("CancelledAt") + .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); + + b.Property("ContextId") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("ContextType") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("CreatedAt") + .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); + + b.Property("Data") + .HasColumnType("NCLOB"); + + b.Property("DefinitionId") + .IsRequired() + .HasColumnType("NVARCHAR2(450)"); + + b.Property("FaultedAt") + .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); + + b.Property("FinishedAt") + .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); + + b.Property("LastExecutedActivityId") + .HasColumnType("NCLOB"); + + b.Property("LastExecutedAt") + .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); + + b.Property("Name") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("TenantId") + .HasColumnType("NVARCHAR2(450)"); + + b.Property("Version") + .HasColumnType("NUMBER(10)"); + + b.Property("WorkflowStatus") + .HasColumnType("NUMBER(10)"); + + b.HasKey("Id"); + + b.HasIndex("ContextId") + .HasDatabaseName("IX_WorkflowInstance_ContextId"); + + b.HasIndex("ContextType") + .HasDatabaseName("IX_WorkflowInstance_ContextType"); + + b.HasIndex("CorrelationId") + .HasDatabaseName("IX_WorkflowInstance_CorrelationId"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_WorkflowInstance_CreatedAt"); + + b.HasIndex("DefinitionId") + .HasDatabaseName("IX_WorkflowInstance_DefinitionId"); + + b.HasIndex("FaultedAt") + .HasDatabaseName("IX_WorkflowInstance_FaultedAt"); + + b.HasIndex("FinishedAt") + .HasDatabaseName("IX_WorkflowInstance_FinishedAt"); + + b.HasIndex("LastExecutedAt") + .HasDatabaseName("IX_WorkflowInstance_LastExecutedAt"); + + b.HasIndex("Name") + .HasDatabaseName("IX_WorkflowInstance_Name"); + + b.HasIndex("TenantId") + .HasDatabaseName("IX_WorkflowInstance_TenantId"); + + b.HasIndex("WorkflowStatus") + .HasDatabaseName("IX_WorkflowInstance_WorkflowStatus"); + + b.HasIndex("WorkflowStatus", "DefinitionId") + .HasDatabaseName("IX_WorkflowInstance_WorkflowStatus_DefinitionId"); + + b.HasIndex("WorkflowStatus", "DefinitionId", "Version") + .HasDatabaseName("IX_WorkflowInstance_WorkflowStatus_DefinitionId_Version"); + + b.ToTable("WorkflowInstances"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.cs new file mode 100644 index 000000000..1cfa7e248 --- /dev/null +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20211104093625_Update24.cs @@ -0,0 +1,161 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Elsa.Persistence.EntityFramework.Oracle.Migrations +{ + public partial class Update24 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Output", + schema: "Elsa", + table: "WorkflowInstances"); + + migrationBuilder.AlterColumn( + name: "LastExecutedActivityId", + schema: "Elsa", + table: "WorkflowInstances", + type: "NCLOB", + nullable: true, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "Data", + schema: "Elsa", + table: "WorkflowInstances", + type: "NCLOB", + nullable: true, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "EventName", + schema: "Elsa", + table: "WorkflowExecutionLogRecords", + type: "NCLOB", + nullable: true, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "DisplayName", + schema: "Elsa", + table: "WorkflowDefinitions", + type: "NCLOB", + nullable: true, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "Description", + schema: "Elsa", + table: "WorkflowDefinitions", + type: "NCLOB", + nullable: true, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ModelType", + schema: "Elsa", + table: "Bookmarks", + type: "NCLOB", + nullable: false, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)"); + + migrationBuilder.AlterColumn( + name: "Model", + schema: "Elsa", + table: "Bookmarks", + type: "NCLOB", + nullable: false, + oldClrType: typeof(string), + oldType: "NVARCHAR2(2000)"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "LastExecutedActivityId", + schema: "Elsa", + table: "WorkflowInstances", + type: "NVARCHAR2(2000)", + nullable: true, + oldClrType: typeof(string), + oldType: "NCLOB", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "Data", + schema: "Elsa", + table: "WorkflowInstances", + type: "NVARCHAR2(2000)", + nullable: true, + oldClrType: typeof(string), + oldType: "NCLOB", + oldNullable: true); + + migrationBuilder.AddColumn( + name: "Output", + schema: "Elsa", + table: "WorkflowInstances", + type: "NCLOB", + nullable: true); + + migrationBuilder.AlterColumn( + name: "EventName", + schema: "Elsa", + table: "WorkflowExecutionLogRecords", + type: "NVARCHAR2(2000)", + nullable: true, + oldClrType: typeof(string), + oldType: "NCLOB", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "DisplayName", + schema: "Elsa", + table: "WorkflowDefinitions", + type: "NVARCHAR2(2000)", + nullable: true, + oldClrType: typeof(string), + oldType: "NCLOB", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "Description", + schema: "Elsa", + table: "WorkflowDefinitions", + type: "NVARCHAR2(2000)", + nullable: true, + oldClrType: typeof(string), + oldType: "NCLOB", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "ModelType", + schema: "Elsa", + table: "Bookmarks", + type: "NVARCHAR2(2000)", + nullable: false, + oldClrType: typeof(string), + oldType: "NCLOB"); + + migrationBuilder.AlterColumn( + name: "Model", + schema: "Elsa", + table: "Bookmarks", + type: "NVARCHAR2(2000)", + nullable: false, + oldClrType: typeof(string), + oldType: "NCLOB"); + } + } +} diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/ElsaContextModelSnapshot.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/ElsaContextModelSnapshot.cs index 02e330f0e..730fec920 100644 --- a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/ElsaContextModelSnapshot.cs +++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/ElsaContextModelSnapshot.cs @@ -34,6 +34,7 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations .HasColumnType("NVARCHAR2(450)"); b.Property("CorrelationId") + .IsRequired() .HasColumnType("NVARCHAR2(450)"); b.Property("Hash") @@ -42,11 +43,11 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations b.Property("Model") .IsRequired() - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("ModelType") .IsRequired() - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("TenantId") .HasColumnType("NVARCHAR2(450)"); @@ -90,7 +91,7 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations .HasColumnType("NVARCHAR2(450)"); b.Property("Data") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("DefinitionId") .IsRequired() @@ -100,10 +101,10 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations .HasColumnType("NUMBER(1)"); b.Property("Description") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("DisplayName") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("IsLatest") .HasColumnType("NUMBER(1)"); @@ -170,16 +171,16 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations .HasColumnType("NVARCHAR2(450)"); b.Property("Data") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("EventName") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("Message") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("Source") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("TenantId") .HasColumnType("NVARCHAR2(450)"); @@ -233,7 +234,7 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); b.Property("Data") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("DefinitionId") .IsRequired() @@ -246,7 +247,7 @@ namespace Elsa.Persistence.EntityFramework.Oracle.Migrations .HasColumnType("TIMESTAMP(7) WITH TIME ZONE"); b.Property("LastExecutedActivityId") - .HasColumnType("NVARCHAR2(2000)"); + .HasColumnType("NCLOB"); b.Property("LastExecutedAt") .HasColumnType("TIMESTAMP(7) WITH TIME ZONE");