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
This commit is contained in:
Akbar Ghasemi Tazehabadi 2021-07-20 12:49:46 +02:00 committed by GitHub
parent 20406c5e39
commit 726c16b702
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 1068 additions and 0 deletions

View file

@ -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}

View file

@ -0,0 +1,17 @@
using Elsa.Persistence.EntityFramework.Core;
using Microsoft.EntityFrameworkCore;
using System;
namespace Elsa.Persistence.EntityFramework.Oracle
{
public static class DbContextOptionsBuilderExtensions
{
/// <summary>
/// Configures the context to use Oracle.
/// </summary>
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));
}
}

View file

@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\common.props" />
<Import Project="..\..\..\..\configureawait.props" />
<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;net5.0</TargetFrameworks>
<Description>
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.
</Description>
<PackageTags>elsa, workflows, efcore, oracle</PackageTags>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Elsa.Persistence.EntityFramework.Core\Elsa.Persistence.EntityFramework.Core.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Oracle.EntityFrameworkCore" Version="5.21.1" />
</ItemGroup>
<ItemGroup>
<Folder Include="Migrations\" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait />
</Weavers>

View file

@ -0,0 +1,314 @@
// <auto-generated />
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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityType")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("CorrelationId")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Hash")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Model")
.IsRequired()
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("ModelType")
.IsRequired()
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Data")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("DefinitionId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<bool>("DeleteCompletedInstances")
.HasColumnType("NUMBER(1)");
b.Property<string>("Description")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("DisplayName")
.HasColumnType("NVARCHAR2(2000)");
b.Property<bool>("IsLatest")
.HasColumnType("NUMBER(1)");
b.Property<bool>("IsPublished")
.HasColumnType("NUMBER(1)");
b.Property<bool>("IsSingleton")
.HasColumnType("NUMBER(1)");
b.Property<string>("Name")
.HasColumnType("NVARCHAR2(450)");
b.Property<int>("PersistenceBehavior")
.HasColumnType("NUMBER(10)");
b.Property<string>("Tag")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<int>("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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityType")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Data")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("EventName")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("Message")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("Source")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset>("Timestamp")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset?>("CancelledAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("ContextId")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ContextType")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("CorrelationId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("Data")
.HasColumnType("NVARCHAR2(2000)");
b.Property<string>("DefinitionId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset?>("FaultedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<DateTimeOffset?>("FinishedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("LastExecutedActivityId")
.HasColumnType("NVARCHAR2(2000)");
b.Property<DateTimeOffset?>("LastExecutedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("Name")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<int>("Version")
.HasColumnType("NUMBER(10)");
b.Property<int>("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
}
}
}

View file

@ -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<string>(type: "NVARCHAR2(450)", nullable: false),
TenantId = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
Hash = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
Model = table.Column<string>(type: "NCLOB", nullable: false),
ModelType = table.Column<string>(type: "NCLOB", nullable: false),
ActivityType = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
ActivityId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
WorkflowInstanceId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
CorrelationId = table.Column<string>(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<string>(type: "NVARCHAR2(450)", nullable: false),
DefinitionId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
TenantId = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
Name = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
DisplayName = table.Column<string>(type: "NCLOB", nullable: true),
Description = table.Column<string>(type: "NCLOB", nullable: true),
Version = table.Column<int>(type: "NUMBER(10)", nullable: false),
IsSingleton = table.Column<bool>(type: "NUMBER(1)", nullable: false),
PersistenceBehavior = table.Column<int>(type: "NUMBER(10)", nullable: false),
DeleteCompletedInstances = table.Column<bool>(type: "NUMBER(1)", nullable: false),
IsPublished = table.Column<bool>(type: "NUMBER(1)", nullable: false),
IsLatest = table.Column<bool>(type: "NUMBER(1)", nullable: false),
Tag = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
Data = table.Column<string>(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<string>(type: "NVARCHAR2(450)", nullable: false),
TenantId = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
WorkflowInstanceId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
ActivityId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
ActivityType = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
Timestamp = table.Column<DateTimeOffset>(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: false),
EventName = table.Column<string>(type: "NCLOB", nullable: true),
Message = table.Column<string>(type: "NCLOB", nullable: true),
Source = table.Column<string>(type: "NCLOB", nullable: true),
Data = table.Column<string>(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<string>(type: "NVARCHAR2(450)", nullable: false),
DefinitionId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
TenantId = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
Version = table.Column<int>(type: "NUMBER(10)", nullable: false),
WorkflowStatus = table.Column<int>(type: "NUMBER(10)", nullable: false),
CorrelationId = table.Column<string>(type: "NVARCHAR2(450)", nullable: false),
ContextType = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
ContextId = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
Name = table.Column<string>(type: "NVARCHAR2(450)", nullable: true),
CreatedAt = table.Column<DateTimeOffset>(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: false),
LastExecutedAt = table.Column<DateTimeOffset>(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
FinishedAt = table.Column<DateTimeOffset>(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
CancelledAt = table.Column<DateTimeOffset>(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
FaultedAt = table.Column<DateTimeOffset>(type: "TIMESTAMP(7) WITH TIME ZONE", nullable: true),
LastExecutedActivityId = table.Column<string>(type: "NCLOB", nullable: true),
Data = table.Column<string>(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");
}
}
}

View file

@ -0,0 +1,312 @@
// <auto-generated />
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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityType")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("CorrelationId")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Hash")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Model")
.IsRequired()
.HasColumnType("NCLOB");
b.Property<string>("ModelType")
.IsRequired()
.HasColumnType("NCLOB");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Data")
.HasColumnType("NCLOB");
b.Property<string>("DefinitionId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<bool>("DeleteCompletedInstances")
.HasColumnType("NUMBER(1)");
b.Property<string>("Description")
.HasColumnType("NCLOB");
b.Property<string>("DisplayName")
.HasColumnType("NCLOB");
b.Property<bool>("IsLatest")
.HasColumnType("NUMBER(1)");
b.Property<bool>("IsPublished")
.HasColumnType("NUMBER(1)");
b.Property<bool>("IsSingleton")
.HasColumnType("NUMBER(1)");
b.Property<string>("Name")
.HasColumnType("NVARCHAR2(450)");
b.Property<int>("PersistenceBehavior")
.HasColumnType("NUMBER(10)");
b.Property<string>("Tag")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<int>("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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ActivityType")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("Data")
.HasColumnType("NCLOB");
b.Property<string>("EventName")
.HasColumnType("NCLOB)");
b.Property<string>("Message")
.HasColumnType("NCLOB");
b.Property<string>("Source")
.HasColumnType("NCLOB");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset>("Timestamp")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("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<string>("Id")
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset?>("CancelledAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("ContextId")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("ContextType")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("CorrelationId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("Data")
.HasColumnType("NCLOB");
b.Property<string>("DefinitionId")
.IsRequired()
.HasColumnType("NVARCHAR2(450)");
b.Property<DateTimeOffset?>("FaultedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<DateTimeOffset?>("FinishedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("LastExecutedActivityId")
.HasColumnType("NCLOB");
b.Property<DateTimeOffset?>("LastExecutedAt")
.HasColumnType("TIMESTAMP(7) WITH TIME ZONE");
b.Property<string>("Name")
.HasColumnType("NVARCHAR2(450)");
b.Property<string>("TenantId")
.HasColumnType("NVARCHAR2(450)");
b.Property<int>("Version")
.HasColumnType("NUMBER(10)");
b.Property<int>("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
}
}
}

View file

@ -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<ElsaContext>
{
public ElsaContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<ElsaContext>();
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);
}
}
}

View file

@ -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}"`