diff --git a/Elsa.sln b/Elsa.sln
index 4d05d3ff6..186bbe3e9 100644
--- a/Elsa.sln
+++ b/Elsa.sln
@@ -269,6 +269,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ElsaStudioWebAssembly", "sr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.EntityFrameworkCore.Common", "src\modules\Elsa.EntityFrameworkCore.Common\Elsa.EntityFrameworkCore.Common.csproj", "{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.Sqlite", "src\modules\Elsa.Quartz.EntityFrameworkCore.Sqlite\Elsa.Quartz.EntityFrameworkCore.Sqlite.csproj", "{A71557F2-D5FB-4772-9391-F7D18A3B6C44}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.SqlServer", "src\modules\Elsa.Quartz.EntityFrameworkCore.SqlServer\Elsa.Quartz.EntityFrameworkCore.SqlServer.csproj", "{05F3B23E-CF28-467B-AD3C-595EA4ED6B96}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.MySql", "src\modules\Elsa.Quartz.EntityFrameworkCore.MySql\Elsa.Quartz.EntityFrameworkCore.MySql.csproj", "{74ACD9D0-8B4C-42FA-A582-E93BF0075023}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Quartz.EntityFrameworkCore.PostgreSql", "src\modules\Elsa.Quartz.EntityFrameworkCore.PostgreSql\Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj", "{CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -671,6 +679,22 @@ Global
{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A71557F2-D5FB-4772-9391-F7D18A3B6C44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {05F3B23E-CF28-467B-AD3C-595EA4ED6B96}.Release|Any CPU.Build.0 = Release|Any CPU
+ {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {74ACD9D0-8B4C-42FA-A582-E93BF0075023}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -794,6 +818,10 @@ Global
{9504E3F3-F77F-437A-8644-D23D7F5FCF8B} = {1B8D5897-902E-4632-8698-E89CAF3DDF54}
{E12A1BDF-5D65-493B-835D-AFBC480A5650} = {F06B9573-DF68-4606-866C-A7546A10A05A}
{FBA14F8A-9F14-4364-ABDB-B8AE81A0D755} = {9B4F139F-7D26-435C-A561-89E65A67A8E5}
+ {A71557F2-D5FB-4772-9391-F7D18A3B6C44} = {AB797AF0-C12C-46DE-A157-7E25625C6200}
+ {05F3B23E-CF28-467B-AD3C-595EA4ED6B96} = {AB797AF0-C12C-46DE-A157-7E25625C6200}
+ {74ACD9D0-8B4C-42FA-A582-E93BF0075023} = {AB797AF0-C12C-46DE-A157-7E25625C6200}
+ {CCCCEF8C-7D96-4BEA-B9D0-E91EDF08E65D} = {AB797AF0-C12C-46DE-A157-7E25625C6200}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E}
diff --git a/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj b/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj
index bfc68cac8..fd10cdc39 100644
--- a/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj
+++ b/src/bundles/Elsa.WorkflowServer.Web/Elsa.WorkflowServer.Web.csproj
@@ -14,6 +14,7 @@
+
diff --git a/src/bundles/Elsa.WorkflowServer.Web/Program.cs b/src/bundles/Elsa.WorkflowServer.Web/Program.cs
index 7a969cdcf..dc2a02c63 100644
--- a/src/bundles/Elsa.WorkflowServer.Web/Program.cs
+++ b/src/bundles/Elsa.WorkflowServer.Web/Program.cs
@@ -27,6 +27,7 @@ const bool useSqlServer = false;
const bool useDapper = false;
const bool useProtoActor = false;
const bool useHangfire = false;
+const bool useQuartz = true;
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
@@ -135,13 +136,13 @@ services
{
if (useHangfire)
scheduling.UseHangfireScheduler();
+
+ if (useQuartz)
+ scheduling.UseQuartzScheduler();
})
.UseWorkflowsApi(api => api.AddFastEndpointsAssembly())
.UseRealTimeWorkflows()
- .UseJavaScript(js =>
- {
- js.JintOptions = options => options.AllowClrAccess = true;
- })
+ .UseJavaScript(js => { js.JintOptions = options => options.AllowClrAccess = true; })
.UseLiquid(liquid => liquid.FluidOptions = options => options.Encoder = HtmlEncoder.Default)
.UseHttp(http =>
{
@@ -163,7 +164,14 @@ services
})
.UseWorkflowContexts();
- // Initialize drop-ins.
+ if (useQuartz)
+ {
+ elsa.UseQuartz(quartz =>
+ {
+ quartz.UseSqlite(sqliteConnectionString);
+ });
+ }
+
elsa.InstallDropIns(options => options.DropInRootDirectory = Path.Combine(Directory.GetCurrentDirectory(), "App_Data", "DropIns"));
elsa.AddSwagger();
diff --git a/src/bundles/Elsa.WorkflowServer.Web/appsettings.json b/src/bundles/Elsa.WorkflowServer.Web/appsettings.json
index f4c10c172..294b390fb 100644
--- a/src/bundles/Elsa.WorkflowServer.Web/appsettings.json
+++ b/src/bundles/Elsa.WorkflowServer.Web/appsettings.json
@@ -4,7 +4,6 @@
"Default": "Warning",
"Elsa.Mediator": "Warning",
"Elsa.Workflows.Runtime.HostedServices": "Information",
- "Elsa.Workflows.Core.Activities.Flowchart.Activities.Flowchart": "Debug",
"MassTransit": "Warning",
"Microsoft.Extensions.Http": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
@@ -97,5 +96,8 @@
"SweepInterval": "00:00:10:00",
"BatchSize": 1000
}
+ },
+ "Quartz": {
+
}
}
\ No newline at end of file
diff --git a/src/common/Elsa.Features/Implementations/Module.cs b/src/common/Elsa.Features/Implementations/Module.cs
index 87404f0f0..7347fd783 100644
--- a/src/common/Elsa.Features/Implementations/Module.cs
+++ b/src/common/Elsa.Features/Implementations/Module.cs
@@ -63,7 +63,13 @@ public class Module : IModule
///
public IModule ConfigureHostedService(int priority = 0) where T : class, IHostedService
{
- _hostedServiceDescriptors.Add(new HostedServiceDescriptor(priority, typeof(T)));
+ return ConfigureHostedService(typeof(T), priority);
+ }
+
+ ///
+ public IModule ConfigureHostedService(Type hostedServiceType, int priority = 0)
+ {
+ _hostedServiceDescriptors.Add(new HostedServiceDescriptor(priority, hostedServiceType));
return this;
}
diff --git a/src/common/Elsa.Features/Services/IModule.cs b/src/common/Elsa.Features/Services/IModule.cs
index 9712be22f..22af7e7c0 100644
--- a/src/common/Elsa.Features/Services/IModule.cs
+++ b/src/common/Elsa.Features/Services/IModule.cs
@@ -33,6 +33,11 @@ public interface IModule
///
IModule ConfigureHostedService(int priority = 0) where T : class, IHostedService;
+ ///
+ /// Configures a using an optional priority to control in which order it will be registered with the service container.
+ ///
+ IModule ConfigureHostedService(Type hostedServiceType, int priority = 0);
+
///
/// Will apply all configured features, causing the collection to be populated.
///
diff --git a/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs b/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs
index f1d2b11cb..27956abf4 100644
--- a/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs
+++ b/src/modules/Elsa.EntityFrameworkCore.Common/Abstractions/DesignTimeDbContextFactoryBase.cs
@@ -25,7 +25,7 @@ public abstract class DesignTimeDbContextFactoryBase : IDesignTimeDb
ConfigureBuilder(builder, connectionString);
- return (TDbContext)Activator.CreateInstance(typeof(TDbContext), builder.Options)!;
+ return (TDbContext)Activator.CreateInstance(typeof(TDbContext), builder.Options);
}
///
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj
new file mode 100644
index 000000000..7c846f4fb
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ net6.0;net7.0
+
+ Provides EF Core migrations for Quartz.NET.
+
+ elsa module scheduling quartz ef core migrations
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs
new file mode 100644
index 000000000..84cb5b586
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.Designer.cs
@@ -0,0 +1,541 @@
+//
+using System;
+using Elsa.Quartz.EntityFrameworkCore.MySql;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Elsa.Quartz.EntityFrameworkCore.MySql.Migrations
+{
+ [DbContext(typeof(MySqlQuartzDbContext))]
+ [Migration("20231029144426_AddQuartz")]
+ partial class AddQuartz
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.13")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("BlobData")
+ .HasColumnType("blob")
+ .HasColumnName("BLOB_DATA");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_BLOB_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("CalendarName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("CALENDAR_NAME");
+
+ b.Property("Calendar")
+ .IsRequired()
+ .HasColumnType("blob")
+ .HasColumnName("CALENDAR");
+
+ b.HasKey("SchedulerName", "CalendarName");
+
+ b.ToTable("QRTZ_CALENDARS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("CronExpression")
+ .IsRequired()
+ .HasColumnType("varchar(120)")
+ .HasColumnName("CRON_EXPRESSION");
+
+ b.Property("TimeZoneId")
+ .HasColumnType("varchar(80)")
+ .HasColumnName("TIME_ZONE_ID");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_CRON_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("EntryId")
+ .HasColumnType("varchar(140)")
+ .HasColumnName("ENTRY_ID");
+
+ b.Property("FiredTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("FIRED_TIME");
+
+ b.Property("InstanceName")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("INSTANCE_NAME");
+
+ b.Property("IsNonConcurrent")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_NONCONCURRENT");
+
+ b.Property("JobGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_GROUP");
+
+ b.Property("JobName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_NAME");
+
+ b.Property("Priority")
+ .HasColumnType("integer")
+ .HasColumnName("PRIORITY");
+
+ b.Property("RequestsRecovery")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("REQUESTS_RECOVERY");
+
+ b.Property("ScheduledTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("SCHED_TIME");
+
+ b.Property("State")
+ .IsRequired()
+ .HasColumnType("varchar(16)")
+ .HasColumnName("STATE");
+
+ b.Property("TriggerGroup")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("TriggerName")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.HasKey("SchedulerName", "EntryId");
+
+ b.HasIndex("InstanceName")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME");
+
+ b.HasIndex("JobGroup")
+ .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP");
+
+ b.HasIndex("JobName")
+ .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME");
+
+ b.HasIndex("RequestsRecovery")
+ .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY");
+
+ b.HasIndex("TriggerGroup")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP");
+
+ b.HasIndex("TriggerName")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME");
+
+ b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP");
+
+ b.ToTable("QRTZ_FIRED_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("JobName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_NAME");
+
+ b.Property("JobGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_GROUP");
+
+ b.Property("Description")
+ .HasColumnType("varchar(250)")
+ .HasColumnName("DESCRIPTION");
+
+ b.Property("IsDurable")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_DURABLE");
+
+ b.Property("IsNonConcurrent")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_NONCONCURRENT");
+
+ b.Property("IsUpdateData")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_UPDATE_DATA");
+
+ b.Property("JobClassName")
+ .IsRequired()
+ .HasColumnType("varchar(250)")
+ .HasColumnName("JOB_CLASS_NAME");
+
+ b.Property("JobData")
+ .HasColumnType("blob")
+ .HasColumnName("JOB_DATA");
+
+ b.Property("RequestsRecovery")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("REQUESTS_RECOVERY");
+
+ b.HasKey("SchedulerName", "JobName", "JobGroup");
+
+ b.HasIndex("RequestsRecovery")
+ .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY");
+
+ b.ToTable("QRTZ_JOB_DETAILS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("LockName")
+ .HasColumnType("varchar(40)")
+ .HasColumnName("LOCK_NAME");
+
+ b.HasKey("SchedulerName", "LockName");
+
+ b.ToTable("QRTZ_LOCKS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.HasKey("SchedulerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("InstanceName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("INSTANCE_NAME");
+
+ b.Property("CheckInInterval")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("CHECKIN_INTERVAL");
+
+ b.Property("LastCheckInTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("LAST_CHECKIN_TIME");
+
+ b.HasKey("SchedulerName", "InstanceName");
+
+ b.ToTable("QRTZ_SCHEDULER_STATE", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("BooleanProperty1")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("BOOL_PROP_1");
+
+ b.Property("BooleanProperty2")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("BOOL_PROP_2");
+
+ b.Property("DecimalProperty1")
+ .HasColumnType("NUMERIC(13,4)")
+ .HasColumnName("DEC_PROP_1");
+
+ b.Property("DecimalProperty2")
+ .HasColumnType("NUMERIC(13,4)")
+ .HasColumnName("DEC_PROP_2");
+
+ b.Property("IntegerProperty1")
+ .HasColumnType("int")
+ .HasColumnName("INT_PROP_1");
+
+ b.Property("IntegerProperty2")
+ .HasColumnType("int")
+ .HasColumnName("INT_PROP_2");
+
+ b.Property("LongProperty1")
+ .HasColumnType("BIGINT")
+ .HasColumnName("LONG_PROP_1");
+
+ b.Property("LongProperty2")
+ .HasColumnType("BIGINT")
+ .HasColumnName("LONG_PROP_2");
+
+ b.Property("StringProperty1")
+ .HasColumnType("varchar(512)")
+ .HasColumnName("STR_PROP_1");
+
+ b.Property("StringProperty2")
+ .HasColumnType("varchar(512)")
+ .HasColumnName("STR_PROP_2");
+
+ b.Property("StringProperty3")
+ .HasColumnType("varchar(512)")
+ .HasColumnName("STR_PROP_3");
+
+ b.Property("TimeZoneId")
+ .HasColumnType("varchar(80)")
+ .HasColumnName("TIME_ZONE_ID");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_SIMPROP_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("RepeatCount")
+ .HasColumnType("bigint(7)")
+ .HasColumnName("REPEAT_COUNT");
+
+ b.Property("RepeatInterval")
+ .HasColumnType("bigint(12)")
+ .HasColumnName("REPEAT_INTERVAL");
+
+ b.Property("TimesTriggered")
+ .HasColumnType("bigint(10)")
+ .HasColumnName("TIMES_TRIGGERED");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_SIMPLE_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("CalendarName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("CALENDAR_NAME");
+
+ b.Property("Description")
+ .HasColumnType("varchar(250)")
+ .HasColumnName("DESCRIPTION");
+
+ b.Property("EndTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("END_TIME");
+
+ b.Property("JobData")
+ .HasColumnType("blob")
+ .HasColumnName("JOB_DATA");
+
+ b.Property("JobGroup")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_GROUP");
+
+ b.Property("JobName")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_NAME");
+
+ b.Property("MisfireInstruction")
+ .HasColumnType("smallint(2)")
+ .HasColumnName("MISFIRE_INSTR");
+
+ b.Property("NextFireTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("NEXT_FIRE_TIME");
+
+ b.Property("PreviousFireTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("PREV_FIRE_TIME");
+
+ b.Property("Priority")
+ .HasColumnType("integer")
+ .HasColumnName("PRIORITY");
+
+ b.Property("StartTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("START_TIME");
+
+ b.Property("TriggerState")
+ .IsRequired()
+ .HasColumnType("varchar(16)")
+ .HasColumnName("TRIGGER_STATE");
+
+ b.Property("TriggerType")
+ .IsRequired()
+ .HasColumnType("varchar(8)")
+ .HasColumnName("TRIGGER_TYPE");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.HasIndex("NextFireTime")
+ .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME");
+
+ b.HasIndex("TriggerState")
+ .HasDatabaseName("IDX_QRTZ_T_STATE");
+
+ b.HasIndex("NextFireTime", "TriggerState")
+ .HasDatabaseName("IDX_QRTZ_T_NFT_ST");
+
+ b.HasIndex("SchedulerName", "JobName", "JobGroup");
+
+ b.ToTable("QRTZ_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("BlobTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("CronTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("SimplePropertyTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("SimpleTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail")
+ .WithMany("Triggers")
+ .HasForeignKey("SchedulerName", "JobName", "JobGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("JobDetail");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b =>
+ {
+ b.Navigation("Triggers");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b =>
+ {
+ b.Navigation("BlobTriggers");
+
+ b.Navigation("CronTriggers");
+
+ b.Navigation("SimplePropertyTriggers");
+
+ b.Navigation("SimpleTriggers");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs
new file mode 100644
index 000000000..e43acbc9d
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/20231029144426_AddQuartz.cs
@@ -0,0 +1,393 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Elsa.Quartz.EntityFrameworkCore.MySql.Migrations
+{
+ ///
+ public partial class AddQuartz : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterDatabase()
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_CALENDARS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ CALENDAR_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ CALENDAR = table.Column(type: "blob", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_CALENDARS", x => new { x.SCHED_NAME, x.CALENDAR_NAME });
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_FIRED_TRIGGERS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ ENTRY_ID = table.Column(type: "varchar(140)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ INSTANCE_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ FIRED_TIME = table.Column(type: "bigint(19)", nullable: false),
+ SCHED_TIME = table.Column(type: "bigint(19)", nullable: false),
+ PRIORITY = table.Column(type: "integer", nullable: false),
+ STATE = table.Column(type: "varchar(16)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_NAME = table.Column(type: "varchar(200)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_GROUP = table.Column(type: "varchar(200)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ IS_NONCONCURRENT = table.Column(type: "tinyint(1)", nullable: false),
+ REQUESTS_RECOVERY = table.Column(type: "tinyint(1)", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_FIRED_TRIGGERS", x => new { x.SCHED_NAME, x.ENTRY_ID });
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_JOB_DETAILS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ DESCRIPTION = table.Column(type: "varchar(250)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_CLASS_NAME = table.Column(type: "varchar(250)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ IS_DURABLE = table.Column(type: "tinyint(1)", nullable: false),
+ IS_NONCONCURRENT = table.Column(type: "tinyint(1)", nullable: false),
+ IS_UPDATE_DATA = table.Column(type: "tinyint(1)", nullable: false),
+ REQUESTS_RECOVERY = table.Column(type: "tinyint(1)", nullable: false),
+ JOB_DATA = table.Column(type: "blob", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_JOB_DETAILS", x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP });
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_LOCKS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ LOCK_NAME = table.Column(type: "varchar(40)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4")
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_LOCKS", x => new { x.SCHED_NAME, x.LOCK_NAME });
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_PAUSED_TRIGGER_GRPS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4")
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_PAUSED_TRIGGER_GRPS", x => new { x.SCHED_NAME, x.TRIGGER_GROUP });
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_SCHEDULER_STATE",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ INSTANCE_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ LAST_CHECKIN_TIME = table.Column(type: "bigint(19)", nullable: false),
+ CHECKIN_INTERVAL = table.Column(type: "bigint(19)", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_SCHEDULER_STATE", x => new { x.SCHED_NAME, x.INSTANCE_NAME });
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_TRIGGERS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ JOB_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ DESCRIPTION = table.Column(type: "varchar(250)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ NEXT_FIRE_TIME = table.Column(type: "bigint(19)", nullable: true),
+ PREV_FIRE_TIME = table.Column(type: "bigint(19)", nullable: true),
+ PRIORITY = table.Column(type: "integer", nullable: true),
+ TRIGGER_STATE = table.Column(type: "varchar(16)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_TYPE = table.Column(type: "varchar(8)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ START_TIME = table.Column(type: "bigint(19)", nullable: false),
+ END_TIME = table.Column(type: "bigint(19)", nullable: true),
+ CALENDAR_NAME = table.Column(type: "varchar(200)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ MISFIRE_INSTR = table.Column(type: "smallint(2)", nullable: true),
+ JOB_DATA = table.Column(type: "blob", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP });
+ table.ForeignKey(
+ name: "FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS_SCHED_NAME_JOB_NAME_JOB_GROUP",
+ columns: x => new { x.SCHED_NAME, x.JOB_NAME, x.JOB_GROUP },
+ principalTable: "QRTZ_JOB_DETAILS",
+ principalColumns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" },
+ onDelete: ReferentialAction.Cascade);
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_BLOB_TRIGGERS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ BLOB_DATA = table.Column(type: "blob", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_BLOB_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP });
+ table.ForeignKey(
+ name: "FK_QRTZ_BLOB_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRI~",
+ columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP },
+ principalTable: "QRTZ_TRIGGERS",
+ principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" },
+ onDelete: ReferentialAction.Cascade);
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_CRON_TRIGGERS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ CRON_EXPRESSION = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TIME_ZONE_ID = table.Column(type: "varchar(80)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4")
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_CRON_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP });
+ table.ForeignKey(
+ name: "FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_TRI~",
+ columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP },
+ principalTable: "QRTZ_TRIGGERS",
+ principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" },
+ onDelete: ReferentialAction.Cascade);
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_SIMPLE_TRIGGERS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ REPEAT_COUNT = table.Column(type: "bigint(7)", nullable: false),
+ REPEAT_INTERVAL = table.Column(type: "bigint(12)", nullable: false),
+ TIMES_TRIGGERED = table.Column(type: "bigint(10)", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_SIMPLE_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP });
+ table.ForeignKey(
+ name: "FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_T~",
+ columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP },
+ principalTable: "QRTZ_TRIGGERS",
+ principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" },
+ onDelete: ReferentialAction.Cascade);
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "QRTZ_SIMPROP_TRIGGERS",
+ columns: table => new
+ {
+ SCHED_NAME = table.Column(type: "varchar(120)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_NAME = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ TRIGGER_GROUP = table.Column(type: "varchar(200)", nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ STR_PROP_1 = table.Column(type: "varchar(512)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ STR_PROP_2 = table.Column(type: "varchar(512)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ STR_PROP_3 = table.Column(type: "varchar(512)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ INT_PROP_1 = table.Column(type: "int", nullable: true),
+ INT_PROP_2 = table.Column(type: "int", nullable: true),
+ LONG_PROP_1 = table.Column(type: "BIGINT", nullable: true),
+ LONG_PROP_2 = table.Column(type: "BIGINT", nullable: true),
+ DEC_PROP_1 = table.Column(type: "NUMERIC(13,4)", nullable: true),
+ DEC_PROP_2 = table.Column(type: "NUMERIC(13,4)", nullable: true),
+ BOOL_PROP_1 = table.Column(type: "tinyint(1)", nullable: true),
+ BOOL_PROP_2 = table.Column(type: "tinyint(1)", nullable: true),
+ TIME_ZONE_ID = table.Column(type: "varchar(80)", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4")
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_QRTZ_SIMPROP_TRIGGERS", x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP });
+ table.ForeignKey(
+ name: "FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS_SCHED_NAME_TRIGGER_NAME_~",
+ columns: x => new { x.SCHED_NAME, x.TRIGGER_NAME, x.TRIGGER_GROUP },
+ principalTable: "QRTZ_TRIGGERS",
+ principalColumns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" },
+ onDelete: ReferentialAction.Cascade);
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_JOB_GROUP",
+ table: "QRTZ_FIRED_TRIGGERS",
+ column: "JOB_GROUP");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_JOB_NAME",
+ table: "QRTZ_FIRED_TRIGGERS",
+ column: "JOB_NAME");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_JOB_REQ_RECOVERY",
+ table: "QRTZ_FIRED_TRIGGERS",
+ column: "REQUESTS_RECOVERY");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_TRIG_GROUP",
+ table: "QRTZ_FIRED_TRIGGERS",
+ column: "TRIGGER_GROUP");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_TRIG_INST_NAME",
+ table: "QRTZ_FIRED_TRIGGERS",
+ column: "INSTANCE_NAME");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_TRIG_NAME",
+ table: "QRTZ_FIRED_TRIGGERS",
+ column: "TRIGGER_NAME");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_FT_TRIG_NM_GP",
+ table: "QRTZ_FIRED_TRIGGERS",
+ columns: new[] { "SCHED_NAME", "TRIGGER_NAME", "TRIGGER_GROUP" });
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_J_REQ_RECOVERY",
+ table: "QRTZ_JOB_DETAILS",
+ column: "REQUESTS_RECOVERY");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_T_NEXT_FIRE_TIME",
+ table: "QRTZ_TRIGGERS",
+ column: "NEXT_FIRE_TIME");
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_T_NFT_ST",
+ table: "QRTZ_TRIGGERS",
+ columns: new[] { "NEXT_FIRE_TIME", "TRIGGER_STATE" });
+
+ migrationBuilder.CreateIndex(
+ name: "IDX_QRTZ_T_STATE",
+ table: "QRTZ_TRIGGERS",
+ column: "TRIGGER_STATE");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_QRTZ_TRIGGERS_SCHED_NAME_JOB_NAME_JOB_GROUP",
+ table: "QRTZ_TRIGGERS",
+ columns: new[] { "SCHED_NAME", "JOB_NAME", "JOB_GROUP" });
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "QRTZ_BLOB_TRIGGERS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_CALENDARS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_CRON_TRIGGERS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_FIRED_TRIGGERS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_LOCKS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_PAUSED_TRIGGER_GRPS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_SCHEDULER_STATE");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_SIMPLE_TRIGGERS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_SIMPROP_TRIGGERS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_TRIGGERS");
+
+ migrationBuilder.DropTable(
+ name: "QRTZ_JOB_DETAILS");
+ }
+ }
+}
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs
new file mode 100644
index 000000000..aab19723b
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Migrations/MySqlQuartzDbContextModelSnapshot.cs
@@ -0,0 +1,538 @@
+//
+using System;
+using Elsa.Quartz.EntityFrameworkCore.MySql;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Elsa.Quartz.EntityFrameworkCore.MySql.Migrations
+{
+ [DbContext(typeof(MySqlQuartzDbContext))]
+ partial class MySqlQuartzDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.13")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("BlobData")
+ .HasColumnType("blob")
+ .HasColumnName("BLOB_DATA");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_BLOB_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("CalendarName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("CALENDAR_NAME");
+
+ b.Property("Calendar")
+ .IsRequired()
+ .HasColumnType("blob")
+ .HasColumnName("CALENDAR");
+
+ b.HasKey("SchedulerName", "CalendarName");
+
+ b.ToTable("QRTZ_CALENDARS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("CronExpression")
+ .IsRequired()
+ .HasColumnType("varchar(120)")
+ .HasColumnName("CRON_EXPRESSION");
+
+ b.Property("TimeZoneId")
+ .HasColumnType("varchar(80)")
+ .HasColumnName("TIME_ZONE_ID");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_CRON_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzFiredTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("EntryId")
+ .HasColumnType("varchar(140)")
+ .HasColumnName("ENTRY_ID");
+
+ b.Property("FiredTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("FIRED_TIME");
+
+ b.Property("InstanceName")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("INSTANCE_NAME");
+
+ b.Property("IsNonConcurrent")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_NONCONCURRENT");
+
+ b.Property("JobGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_GROUP");
+
+ b.Property("JobName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_NAME");
+
+ b.Property("Priority")
+ .HasColumnType("integer")
+ .HasColumnName("PRIORITY");
+
+ b.Property("RequestsRecovery")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("REQUESTS_RECOVERY");
+
+ b.Property("ScheduledTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("SCHED_TIME");
+
+ b.Property("State")
+ .IsRequired()
+ .HasColumnType("varchar(16)")
+ .HasColumnName("STATE");
+
+ b.Property("TriggerGroup")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("TriggerName")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.HasKey("SchedulerName", "EntryId");
+
+ b.HasIndex("InstanceName")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_INST_NAME");
+
+ b.HasIndex("JobGroup")
+ .HasDatabaseName("IDX_QRTZ_FT_JOB_GROUP");
+
+ b.HasIndex("JobName")
+ .HasDatabaseName("IDX_QRTZ_FT_JOB_NAME");
+
+ b.HasIndex("RequestsRecovery")
+ .HasDatabaseName("IDX_QRTZ_FT_JOB_REQ_RECOVERY");
+
+ b.HasIndex("TriggerGroup")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_GROUP");
+
+ b.HasIndex("TriggerName")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_NAME");
+
+ b.HasIndex("SchedulerName", "TriggerName", "TriggerGroup")
+ .HasDatabaseName("IDX_QRTZ_FT_TRIG_NM_GP");
+
+ b.ToTable("QRTZ_FIRED_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("JobName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_NAME");
+
+ b.Property("JobGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_GROUP");
+
+ b.Property("Description")
+ .HasColumnType("varchar(250)")
+ .HasColumnName("DESCRIPTION");
+
+ b.Property("IsDurable")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_DURABLE");
+
+ b.Property("IsNonConcurrent")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_NONCONCURRENT");
+
+ b.Property("IsUpdateData")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("IS_UPDATE_DATA");
+
+ b.Property("JobClassName")
+ .IsRequired()
+ .HasColumnType("varchar(250)")
+ .HasColumnName("JOB_CLASS_NAME");
+
+ b.Property("JobData")
+ .HasColumnType("blob")
+ .HasColumnName("JOB_DATA");
+
+ b.Property("RequestsRecovery")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("REQUESTS_RECOVERY");
+
+ b.HasKey("SchedulerName", "JobName", "JobGroup");
+
+ b.HasIndex("RequestsRecovery")
+ .HasDatabaseName("IDX_QRTZ_J_REQ_RECOVERY");
+
+ b.ToTable("QRTZ_JOB_DETAILS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzLock", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("LockName")
+ .HasColumnType("varchar(40)")
+ .HasColumnName("LOCK_NAME");
+
+ b.HasKey("SchedulerName", "LockName");
+
+ b.ToTable("QRTZ_LOCKS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzPausedTriggerGroup", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.HasKey("SchedulerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_PAUSED_TRIGGER_GRPS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSchedulerState", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("InstanceName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("INSTANCE_NAME");
+
+ b.Property("CheckInInterval")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("CHECKIN_INTERVAL");
+
+ b.Property("LastCheckInTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("LAST_CHECKIN_TIME");
+
+ b.HasKey("SchedulerName", "InstanceName");
+
+ b.ToTable("QRTZ_SCHEDULER_STATE", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("BooleanProperty1")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("BOOL_PROP_1");
+
+ b.Property("BooleanProperty2")
+ .HasColumnType("tinyint(1)")
+ .HasColumnName("BOOL_PROP_2");
+
+ b.Property("DecimalProperty1")
+ .HasColumnType("NUMERIC(13,4)")
+ .HasColumnName("DEC_PROP_1");
+
+ b.Property("DecimalProperty2")
+ .HasColumnType("NUMERIC(13,4)")
+ .HasColumnName("DEC_PROP_2");
+
+ b.Property("IntegerProperty1")
+ .HasColumnType("int")
+ .HasColumnName("INT_PROP_1");
+
+ b.Property("IntegerProperty2")
+ .HasColumnType("int")
+ .HasColumnName("INT_PROP_2");
+
+ b.Property("LongProperty1")
+ .HasColumnType("BIGINT")
+ .HasColumnName("LONG_PROP_1");
+
+ b.Property("LongProperty2")
+ .HasColumnType("BIGINT")
+ .HasColumnName("LONG_PROP_2");
+
+ b.Property("StringProperty1")
+ .HasColumnType("varchar(512)")
+ .HasColumnName("STR_PROP_1");
+
+ b.Property("StringProperty2")
+ .HasColumnType("varchar(512)")
+ .HasColumnName("STR_PROP_2");
+
+ b.Property("StringProperty3")
+ .HasColumnType("varchar(512)")
+ .HasColumnName("STR_PROP_3");
+
+ b.Property("TimeZoneId")
+ .HasColumnType("varchar(80)")
+ .HasColumnName("TIME_ZONE_ID");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_SIMPROP_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("RepeatCount")
+ .HasColumnType("bigint(7)")
+ .HasColumnName("REPEAT_COUNT");
+
+ b.Property("RepeatInterval")
+ .HasColumnType("bigint(12)")
+ .HasColumnName("REPEAT_INTERVAL");
+
+ b.Property("TimesTriggered")
+ .HasColumnType("bigint(10)")
+ .HasColumnName("TIMES_TRIGGERED");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("QRTZ_SIMPLE_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("varchar(120)")
+ .HasColumnName("SCHED_NAME");
+
+ b.Property("TriggerName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_NAME");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("TRIGGER_GROUP");
+
+ b.Property("CalendarName")
+ .HasColumnType("varchar(200)")
+ .HasColumnName("CALENDAR_NAME");
+
+ b.Property("Description")
+ .HasColumnType("varchar(250)")
+ .HasColumnName("DESCRIPTION");
+
+ b.Property("EndTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("END_TIME");
+
+ b.Property("JobData")
+ .HasColumnType("blob")
+ .HasColumnName("JOB_DATA");
+
+ b.Property("JobGroup")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_GROUP");
+
+ b.Property("JobName")
+ .IsRequired()
+ .HasColumnType("varchar(200)")
+ .HasColumnName("JOB_NAME");
+
+ b.Property("MisfireInstruction")
+ .HasColumnType("smallint(2)")
+ .HasColumnName("MISFIRE_INSTR");
+
+ b.Property("NextFireTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("NEXT_FIRE_TIME");
+
+ b.Property("PreviousFireTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("PREV_FIRE_TIME");
+
+ b.Property("Priority")
+ .HasColumnType("integer")
+ .HasColumnName("PRIORITY");
+
+ b.Property("StartTime")
+ .HasColumnType("bigint(19)")
+ .HasColumnName("START_TIME");
+
+ b.Property("TriggerState")
+ .IsRequired()
+ .HasColumnType("varchar(16)")
+ .HasColumnName("TRIGGER_STATE");
+
+ b.Property("TriggerType")
+ .IsRequired()
+ .HasColumnType("varchar(8)")
+ .HasColumnName("TRIGGER_TYPE");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.HasIndex("NextFireTime")
+ .HasDatabaseName("IDX_QRTZ_T_NEXT_FIRE_TIME");
+
+ b.HasIndex("TriggerState")
+ .HasDatabaseName("IDX_QRTZ_T_STATE");
+
+ b.HasIndex("NextFireTime", "TriggerState")
+ .HasDatabaseName("IDX_QRTZ_T_NFT_ST");
+
+ b.HasIndex("SchedulerName", "JobName", "JobGroup");
+
+ b.ToTable("QRTZ_TRIGGERS", (string)null);
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("BlobTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCronTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("CronTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimplePropertyTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("SimplePropertyTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzSimpleTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", "Trigger")
+ .WithMany("SimpleTriggers")
+ .HasForeignKey("SchedulerName", "TriggerName", "TriggerGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Trigger");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b =>
+ {
+ b.HasOne("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", "JobDetail")
+ .WithMany("Triggers")
+ .HasForeignKey("SchedulerName", "JobName", "JobGroup")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("JobDetail");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzJobDetail", b =>
+ {
+ b.Navigation("Triggers");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzTrigger", b =>
+ {
+ b.Navigation("BlobTriggers");
+
+ b.Navigation("CronTriggers");
+
+ b.Navigation("SimplePropertyTriggers");
+
+ b.Navigation("SimpleTriggers");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs
new file mode 100644
index 000000000..97f9b360d
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzDbContext.cs
@@ -0,0 +1,32 @@
+using AppAny.Quartz.EntityFrameworkCore.Migrations;
+using AppAny.Quartz.EntityFrameworkCore.Migrations.MySql;
+using Elsa.EntityFrameworkCore.Common.Abstractions;
+using JetBrains.Annotations;
+using Microsoft.EntityFrameworkCore;
+
+namespace Elsa.Quartz.EntityFrameworkCore.MySql;
+
+///
+/// Quartz DbContext for MySQL.
+///
+[UsedImplicitly]
+public class MySqlQuartzDbContext : DbContext
+{
+ ///
+ public MySqlQuartzDbContext(DbContextOptions options) : base(options)
+ {
+ }
+
+ ///
+ protected override void OnModelCreating(ModelBuilder modelBuilder) => modelBuilder.AddQuartz(model => model.UseMySql());
+}
+
+///
+/// Design-time factory for Quartz DbContext for MySQL.
+///
+[UsedImplicitly]
+public class MySqlQuartzDbContextFactory : DesignTimeDbContextFactoryBase
+{
+ ///
+ protected override void ConfigureBuilder(DbContextOptionsBuilder builder, string connectionString) => builder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
+}
\ No newline at end of file
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs
new file mode 100644
index 000000000..5cc56b460
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/MySqlQuartzExtensions.cs
@@ -0,0 +1,46 @@
+using Elsa.EntityFrameworkCore.Common;
+using Elsa.Quartz.EntityFrameworkCore.MySql;
+using Elsa.Quartz.Features;
+using JetBrains.Annotations;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+using Quartz;
+
+// ReSharper disable once CheckNamespace
+namespace Elsa.EntityFrameworkCore.Extensions;
+
+///
+/// Provides extensions to configure EF Core to use SQL Server.
+///
+[PublicAPI]
+public static class MySqlQuartzExtensions
+{
+ ///
+ /// Configures the to use the MySQL job store.
+ ///
+ public static QuartzFeature UseMySql(this QuartzFeature feature, string connectionString = Constants.DefaultConnectionString, bool useClustering = true)
+ {
+ feature.Services.AddDbContextFactory(options =>
+ {
+ // Use MySQL migrations.
+ options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), sqlServerDbContextOptionsBuilder => { sqlServerDbContextOptionsBuilder.MigrationsAssembly(typeof(MySqlQuartzDbContext).Assembly.GetName().Name); });
+ });
+
+ feature.ConfigureQuartz += quartz =>
+ {
+ quartz.UsePersistentStore(store =>
+ {
+ store.UseNewtonsoftJsonSerializer();
+ store.UseMySql(connectionString);
+
+ if (useClustering)
+ store.UseClustering();
+ });
+ };
+
+ // Configure the Quartz hosted service to run migrations.
+ feature.Module.ConfigureHostedService>(-100);
+
+ return feature;
+ }
+}
\ No newline at end of file
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj
new file mode 100644
index 000000000..3214eb1f9
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Elsa.Quartz.EntityFrameworkCore.PostgreSql.csproj
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+ net6.0;net7.0
+
+ Provides EF Core migrations for Quartz.NET.
+
+ elsa module scheduling quartz ef core migrations
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs
new file mode 100644
index 000000000..65693f773
--- /dev/null
+++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.PostgreSql/Migrations/20231029150749_AddQuartz.Designer.cs
@@ -0,0 +1,544 @@
+//
+using System;
+using Elsa.Quartz.EntityFrameworkCore.PostgreSql;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Elsa.Quartz.EntityFrameworkCore.PostgreSql.Migrations
+{
+ [DbContext(typeof(PostgreSqlQuartzDbContext))]
+ [Migration("20231029150749_AddQuartz")]
+ partial class AddQuartz
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.13")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzBlobTrigger", b =>
+ {
+ b.Property("SchedulerName")
+ .HasColumnType("text")
+ .HasColumnName("sched_name");
+
+ b.Property("TriggerName")
+ .HasColumnType("text")
+ .HasColumnName("trigger_name");
+
+ b.Property("TriggerGroup")
+ .HasColumnType("text")
+ .HasColumnName("trigger_group");
+
+ b.Property("BlobData")
+ .HasColumnType("bytea")
+ .HasColumnName("blob_data");
+
+ b.HasKey("SchedulerName", "TriggerName", "TriggerGroup");
+
+ b.ToTable("qrtz_blob_triggers", "quartz");
+ });
+
+ modelBuilder.Entity("AppAny.Quartz.EntityFrameworkCore.Migrations.QuartzCalendar", b =>
+ {
+ b.Property