From 726c16b702efb0c736a13300c9a55dac2f153534 Mon Sep 17 00:00:00 2001
From: Akbar Ghasemi Tazehabadi <46082076+akghasemi@users.noreply.github.com>
Date: Tue, 20 Jul 2021 12:49:46 +0200
Subject: [PATCH] Added support of Oracle as persistence EF Provider (#1275)
* Added support of Oracle as persistence database provider
* Added migration for Oracle
* Fixed bugs in oracle data types
* fixing some comments
---
Elsa.sln | 25 ++
.../DbContextOptionsBuilderExtensions.cs | 17 +
....Persistence.EntityFramework.Oracle.csproj | 32 ++
.../FodyWeavers.xml | 3 +
.../20210707065825_Initial.Designer.cs | 314 +++++++++++++++++
.../Migrations/20210707065825_Initial.cs | 325 ++++++++++++++++++
.../Migrations/ElsaContextModelSnapshot.cs | 312 +++++++++++++++++
.../OracleElsaContextFactory.cs | 26 ++
.../Readme.md | 14 +
9 files changed, 1068 insertions(+)
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/DbContextOptionsBuilderExtensions.cs
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Elsa.Persistence.EntityFramework.Oracle.csproj
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/FodyWeavers.xml
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.Designer.cs
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.cs
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/ElsaContextModelSnapshot.cs
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/OracleElsaContextFactory.cs
create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Readme.md
diff --git a/Elsa.sln b/Elsa.sln
index e6cd9cd2f..7d9aa8640 100644
--- a/Elsa.sln
+++ b/Elsa.sln
@@ -229,6 +229,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Azu
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "blazor", "blazor", "{D86B94DC-A53C-4A67-A820-828DD359C49B}"
EndProject
+
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnetcore", "aspnetcore", "{C869CC72-9A98-4246-9A76-6A50F48AFD85}"
+EndProject
+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Samples.AspNetCore.Monolith", "src\samples\dashboard\aspnetcore\ElsaDashboard.Samples.AspNetCore.Monolith\ElsaDashboard.Samples.AspNetCore.Monolith.csproj", "{F1EF5639-021A-4D22-9D4A-73D57C88EBFA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.Persistence.YesSql", "src\samples\persistence\Elsa.Samples.Persistence.YesSql\Elsa.Samples.Persistence.YesSql.csproj", "{3A30EFFE-32D8-40B8-9C62-427037BB5424}"
@@ -243,6 +247,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{D7F754
docker\Dockerfile-elsa-dashboard-and-server = docker\Dockerfile-elsa-dashboard-and-server
docker\README.md = docker\README.md
EndProjectSection
+
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Persistence.EntityFramework.MySql", "src\persistence\Elsa.Persistence.EntityFramework\Elsa.Persistence.EntityFramework.MySql\Elsa.Persistence.EntityFramework.MySql.csproj", "{D55BC08B-CA82-478A-99F7-EDE90AC33160}"
EndProject
@@ -262,12 +267,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "aspnetcore", "aspnetcore",
docker\Dockerfile-elsa-dashboard-and-server = docker\Dockerfile-elsa-dashboard-and-server
docker\README.md = docker\README.md
EndProjectSection
+
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "github", "github", "{3BF2C5A9-AC69-4587-833F-C16CFC97E100}"
ProjectSection(SolutionItems) = preProject
.github\workflows\publish-latest-dashboard-and-server-docker.yml = .github\workflows\publish-latest-dashboard-and-server-docker.yml
.github\workflows\publish-latest-dashboard-docker.yml = .github\workflows\publish-latest-dashboard-docker.yml
+
.github\workflows\publish-latest-designer-npm.yml = .github\workflows\publish-latest-designer-npm.yml
+
.github\workflows\publish-latest-server-docker.yml = .github\workflows\publish-latest-server-docker.yml
EndProjectSection
EndProject
@@ -280,6 +288,7 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "providers", "providers", "{EC5D4AFD-3F7F-4B51-9C38-F18C60618731}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Providers.Redis", "src\providers\Elsa.Providers.Redis\Elsa.Providers.Redis.csproj", "{9ACA06DA-9AFE-41A2-8109-EFED8B9B14A1}"
+
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Redis", "src\locking\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{D1644D32-AA51-4D10-942E-F2722DB963B4}"
EndProject
@@ -309,6 +318,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Webhooks.Persistence.Y
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Web", "src\dashboards\ElsaDashboard\ElsaDashboard.Web.csproj", "{1129868E-BA72-44C4-941C-A28D9001504B}"
EndProject
+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Samples.BlazorWasm", "src\samples\dashboard\blazor\ElsaDashboard.Samples.BlazorWasm\ElsaDashboard.Samples.BlazorWasm.csproj", "{24A99602-F743-4B1A-AC96-599F34AE916C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "html", "html", "{8E6215AB-FDD3-4011-B598-B6BB63F294BB}"
@@ -319,6 +329,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "html", "html", "{8E6215AB-F
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ElsaDashboard.Samples.BlazorServer", "src\samples\dashboard\blazor\ElsaDashboard.Samples.BlazorServer\ElsaDashboard.Samples.BlazorServer.csproj", "{6A03B177-09E0-4421-9704-945E6248AB69}"
EndProject
+
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Persistence.EntityFramework.Oracle", "src\persistence\Elsa.Persistence.EntityFramework\Elsa.Persistence.EntityFramework.Oracle\Elsa.Persistence.EntityFramework.Oracle.csproj", "{FE6FC5F9-349A-4A3A-B291-CE0614030D5C}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Samples.FaultyWorkflows", "src\samples\aspnet\Elsa.Samples.FaultyWorkflows\Elsa.Samples.FaultyWorkflows.csproj", "{84751112-C2B7-41D4-98F5-D87D7C2E1DAE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.Conductor", "src\activities\Elsa.Activities.Conductor\Elsa.Activities.Conductor.csproj", "{4D4022DD-244B-47EE-95FA-7071EC687B24}"
@@ -328,6 +341,7 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.CustomTenantIdSource", "src\samples\aspnet\Elsa.Samples.CustomTenantIdSource\Elsa.Samples.CustomTenantIdSource.csproj", "{6E191628-927B-42FB-8805-D2977D8FC4E3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaDashboard.Samples.AspNetCore.SubPath", "src\samples\dashboard\aspnetcore\ElsaDashboard.Samples.AspNetCore.SubPath\ElsaDashboard.Samples.AspNetCore.SubPath.csproj", "{BB715C0C-BE88-4F7F-A43F-1F8DFC9A1388}"
+
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -751,6 +765,12 @@ Global
{84751112-C2B7-41D4-98F5-D87D7C2E1DAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{84751112-C2B7-41D4-98F5-D87D7C2E1DAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{84751112-C2B7-41D4-98F5-D87D7C2E1DAE}.Release|Any CPU.Build.0 = Release|Any CPU
+
+ {FE6FC5F9-349A-4A3A-B291-CE0614030D5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FE6FC5F9-349A-4A3A-B291-CE0614030D5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE6FC5F9-349A-4A3A-B291-CE0614030D5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FE6FC5F9-349A-4A3A-B291-CE0614030D5C}.Release|Any CPU.Build.0 = Release|Any CPU
+
{4D4022DD-244B-47EE-95FA-7071EC687B24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D4022DD-244B-47EE-95FA-7071EC687B24}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D4022DD-244B-47EE-95FA-7071EC687B24}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -763,6 +783,7 @@ Global
{BB715C0C-BE88-4F7F-A43F-1F8DFC9A1388}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB715C0C-BE88-4F7F-A43F-1F8DFC9A1388}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB715C0C-BE88-4F7F-A43F-1F8DFC9A1388}.Release|Any CPU.Build.0 = Release|Any CPU
+
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -903,10 +924,14 @@ Global
{8E6215AB-FDD3-4011-B598-B6BB63F294BB} = {4673732F-2853-47BD-91B8-C95C229D2C89}
{6A03B177-09E0-4421-9704-945E6248AB69} = {D86B94DC-A53C-4A67-A820-828DD359C49B}
{84751112-C2B7-41D4-98F5-D87D7C2E1DAE} = {22E75696-6FE9-436A-9097-EE21C603F818}
+
+ {FE6FC5F9-349A-4A3A-B291-CE0614030D5C} = {C865B0FD-E505-48F0-BFAF-0D4D7C1B5CA1}
+
{4D4022DD-244B-47EE-95FA-7071EC687B24} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180}
{39DE1EE2-DF4F-44EB-9F5A-551BEADD6673} = {4673732F-2853-47BD-91B8-C95C229D2C89}
{6E191628-927B-42FB-8805-D2977D8FC4E3} = {22E75696-6FE9-436A-9097-EE21C603F818}
{BB715C0C-BE88-4F7F-A43F-1F8DFC9A1388} = {39DE1EE2-DF4F-44EB-9F5A-551BEADD6673}
+
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/DbContextOptionsBuilderExtensions.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/DbContextOptionsBuilderExtensions.cs
new file mode 100644
index 000000000..4f8940986
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/DbContextOptionsBuilderExtensions.cs
@@ -0,0 +1,17 @@
+using Elsa.Persistence.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using System;
+
+namespace Elsa.Persistence.EntityFramework.Oracle
+{
+ public static class DbContextOptionsBuilderExtensions
+ {
+ ///
+ /// Configures the context to use Oracle.
+ ///
+ public static DbContextOptionsBuilder UseOracle(this DbContextOptionsBuilder builder, string connectionString) =>
+ builder.UseOracle(connectionString, db => db
+ .MigrationsAssembly(typeof(OracleElsaContextFactory).Assembly.GetName().Name)
+ .MigrationsHistoryTable(ElsaContext.MigrationsHistoryTable, ElsaContext.ElsaSchema));
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Elsa.Persistence.EntityFramework.Oracle.csproj b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Elsa.Persistence.EntityFramework.Oracle.csproj
new file mode 100644
index 000000000..13cf94450
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Elsa.Persistence.EntityFramework.Oracle.csproj
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+ netcoreapp3.1;net5.0
+
+ Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application.
+ This package provides Entity Framework Core migrations for the Oracle database provider.
+
+ elsa, workflows, efcore, oracle
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/FodyWeavers.xml b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.Designer.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.Designer.cs
new file mode 100644
index 000000000..ecb359851
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.Designer.cs
@@ -0,0 +1,314 @@
+//
+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("20210707065825_Initial")]
+ partial class Initial
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasDefaultSchema("Elsa")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.6")
+ .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")
+ .HasColumnType("NVARCHAR2(450)");
+
+ b.Property("Hash")
+ .IsRequired()
+ .HasColumnType("NVARCHAR2(450)");
+
+ b.Property("Model")
+ .IsRequired()
+ .HasColumnType("NVARCHAR2(2000)");
+
+ b.Property("ModelType")
+ .IsRequired()
+ .HasColumnType("NVARCHAR2(2000)");
+
+ 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("NVARCHAR2(2000)");
+
+ b.Property("DefinitionId")
+ .IsRequired()
+ .HasColumnType("NVARCHAR2(450)");
+
+ b.Property("DeleteCompletedInstances")
+ .HasColumnType("NUMBER(1)");
+
+ b.Property("Description")
+ .HasColumnType("NVARCHAR2(2000)");
+
+ b.Property("DisplayName")
+ .HasColumnType("NVARCHAR2(2000)");
+
+ 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("NVARCHAR2(2000)");
+
+ b.Property("EventName")
+ .HasColumnType("NVARCHAR2(2000)");
+
+ b.Property("Message")
+ .HasColumnType("NVARCHAR2(2000)");
+
+ b.Property("Source")
+ .HasColumnType("NVARCHAR2(2000)");
+
+ 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("NVARCHAR2(2000)");
+
+ 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("NVARCHAR2(2000)");
+
+ 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/20210707065825_Initial.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.cs
new file mode 100644
index 000000000..2c0c52168
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/20210707065825_Initial.cs
@@ -0,0 +1,325 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Elsa.Persistence.EntityFramework.Oracle.Migrations
+{
+ public partial class Initial : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.EnsureSchema(
+ name: "Elsa");
+
+ migrationBuilder.CreateTable(
+ name: "Bookmarks",
+ schema: "Elsa",
+ columns: table => new
+ {
+ Id = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ TenantId = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ Hash = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ Model = table.Column(type: "NCLOB", nullable: false),
+ ModelType = table.Column(type: "NCLOB", nullable: false),
+ ActivityType = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ ActivityId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ WorkflowInstanceId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ CorrelationId = table.Column(type: "NVARCHAR2(450)", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Bookmarks", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowDefinitions",
+ schema: "Elsa",
+ columns: table => new
+ {
+ Id = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ DefinitionId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ TenantId = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ Name = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ DisplayName = table.Column(type: "NCLOB", nullable: true),
+ Description = table.Column(type: "NCLOB", nullable: true),
+ Version = table.Column(type: "NUMBER(10)", nullable: false),
+ IsSingleton = table.Column(type: "NUMBER(1)", nullable: false),
+ PersistenceBehavior = table.Column(type: "NUMBER(10)", nullable: false),
+ DeleteCompletedInstances = table.Column(type: "NUMBER(1)", nullable: false),
+ IsPublished = table.Column(type: "NUMBER(1)", nullable: false),
+ IsLatest = table.Column(type: "NUMBER(1)", nullable: false),
+ Tag = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ Data = table.Column(type: "NCLOB", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowDefinitions", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowExecutionLogRecords",
+ schema: "Elsa",
+ columns: table => new
+ {
+ Id = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ TenantId = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ WorkflowInstanceId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ ActivityId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ ActivityType = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ Timestamp = table.Column(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: false),
+ EventName = table.Column(type: "NCLOB", nullable: true),
+ Message = table.Column(type: "NCLOB", nullable: true),
+ Source = table.Column(type: "NCLOB", nullable: true),
+ Data = table.Column(type: "NCLOB", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowExecutionLogRecords", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowInstances",
+ schema: "Elsa",
+ columns: table => new
+ {
+ Id = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ DefinitionId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ TenantId = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ Version = table.Column(type: "NUMBER(10)", nullable: false),
+ WorkflowStatus = table.Column(type: "NUMBER(10)", nullable: false),
+ CorrelationId = table.Column(type: "NVARCHAR2(450)", nullable: false),
+ ContextType = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ ContextId = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ Name = table.Column(type: "NVARCHAR2(450)", nullable: true),
+ CreatedAt = table.Column(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: false),
+ LastExecutedAt = table.Column(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
+ FinishedAt = table.Column(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
+ CancelledAt = table.Column(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
+ FaultedAt = table.Column(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
+ LastExecutedActivityId = table.Column(type: "NCLOB", nullable: true),
+ Data = table.Column(type: "NCLOB", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowInstances", x => x.Id);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_ActivityId",
+ schema: "Elsa",
+ table: "Bookmarks",
+ column: "ActivityId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_ActivityType",
+ schema: "Elsa",
+ table: "Bookmarks",
+ column: "ActivityType");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_ActivityType_TenantId_Hash",
+ schema: "Elsa",
+ table: "Bookmarks",
+ columns: new[] { "ActivityType", "TenantId", "Hash" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_CorrelationId",
+ schema: "Elsa",
+ table: "Bookmarks",
+ column: "CorrelationId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_Hash",
+ schema: "Elsa",
+ table: "Bookmarks",
+ column: "Hash");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_Hash_CorrelationId_TenantId",
+ schema: "Elsa",
+ table: "Bookmarks",
+ columns: new[] { "Hash", "CorrelationId", "TenantId" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_TenantId",
+ schema: "Elsa",
+ table: "Bookmarks",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_WorkflowInstanceId",
+ schema: "Elsa",
+ table: "Bookmarks",
+ column: "WorkflowInstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_DefinitionId_VersionId",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ columns: new[] { "DefinitionId", "Version" },
+ unique: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_IsLatest",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ column: "IsLatest");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_IsPublished",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ column: "IsPublished");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_Name",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ column: "Name");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_Tag",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ column: "Tag");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_TenantId",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_Version",
+ schema: "Elsa",
+ table: "WorkflowDefinitions",
+ column: "Version");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_ActivityId",
+ schema: "Elsa",
+ table: "WorkflowExecutionLogRecords",
+ column: "ActivityId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_ActivityType",
+ schema: "Elsa",
+ table: "WorkflowExecutionLogRecords",
+ column: "ActivityType");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_TenantId",
+ schema: "Elsa",
+ table: "WorkflowExecutionLogRecords",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_Timestamp",
+ schema: "Elsa",
+ table: "WorkflowExecutionLogRecords",
+ column: "Timestamp");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_WorkflowInstanceId",
+ schema: "Elsa",
+ table: "WorkflowExecutionLogRecords",
+ column: "WorkflowInstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_ContextId",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "ContextId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_ContextType",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "ContextType");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_CorrelationId",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "CorrelationId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_CreatedAt",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "CreatedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_DefinitionId",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "DefinitionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_FaultedAt",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "FaultedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_FinishedAt",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "FinishedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_LastExecutedAt",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "LastExecutedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_Name",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "Name");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_TenantId",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_WorkflowStatus",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ column: "WorkflowStatus");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_WorkflowStatus_DefinitionId",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ columns: new[] { "WorkflowStatus", "DefinitionId" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_WorkflowStatus_DefinitionId_Version",
+ schema: "Elsa",
+ table: "WorkflowInstances",
+ columns: new[] { "WorkflowStatus", "DefinitionId", "Version" });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Bookmarks",
+ schema: "Elsa");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowDefinitions",
+ schema: "Elsa");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowExecutionLogRecords",
+ schema: "Elsa");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowInstances",
+ schema: "Elsa");
+ }
+ }
+}
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
new file mode 100644
index 000000000..70059df7d
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Migrations/ElsaContextModelSnapshot.cs
@@ -0,0 +1,312 @@
+//
+using System;
+using Elsa.Persistence.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Oracle.EntityFrameworkCore.Metadata;
+
+namespace Elsa.Persistence.EntityFramework.Oracle.Migrations
+{
+ [DbContext(typeof(ElsaContext))]
+ partial class ElsaContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasDefaultSchema("Elsa")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.6")
+ .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")
+ .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/OracleElsaContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/OracleElsaContextFactory.cs
new file mode 100644
index 000000000..8b27dfa11
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/OracleElsaContextFactory.cs
@@ -0,0 +1,26 @@
+using Elsa.Persistence.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Elsa.Persistence.EntityFramework.Oracle
+{
+ public class OracleElsaContextFactory: IDesignTimeDbContextFactory
+ {
+ public ElsaContext CreateDbContext(string[] args)
+ {
+ var builder = new DbContextOptionsBuilder();
+ var connectionString = args.Any() ? args[0] : "Server=127.0.0.1;Port=5432;Database=elsa;User Id=oracle;Password=password;";
+
+ builder.UseOracle(
+ connectionString,
+ db => db.MigrationsAssembly(typeof(OracleElsaContextFactory).Assembly.GetName().Name)
+ .MigrationsHistoryTable(ElsaContext.MigrationsHistoryTable, ElsaContext.ElsaSchema));
+
+ return new ElsaContext(builder.Options);
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Readme.md b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Readme.md
new file mode 100644
index 000000000..4ac615936
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.Oracle/Readme.md
@@ -0,0 +1,14 @@
+### Entity Framework Core Commands
+
+**Generate Migrations**
+
+```
+dotnet ef migrations add Initial -- "{connection string}"
+
+```
+
+etc..
+
+**Apply Migrations**
+
+`dotnet ef database update -- "{connection string}"`
\ No newline at end of file