diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/DbContextOptionsBuilderExtensions.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/DbContextOptionsBuilderExtensions.cs
new file mode 100644
index 000000000..67110e73a
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/DbContextOptionsBuilderExtensions.cs
@@ -0,0 +1,16 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace Elsa.Persistence.EntityFramework.MySql
+{
+ public static class DbContextOptionsBuilderExtensions
+ {
+ ///
+ /// Configures the context to use MySql
+ ///
+ ///
+ ///
+ ///
+ public static DbContextOptionsBuilder UseMySql(this DbContextOptionsBuilder builder, string connectionString) =>
+ builder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), db => db.MigrationsAssembly(typeof(MySqlElsaContextFactory).Assembly.GetName().Name));
+ }
+}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Elsa.Persistence.EntityFramework.MySql.csproj b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Elsa.Persistence.EntityFramework.MySql.csproj
new file mode 100644
index 000000000..904ed9779
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Elsa.Persistence.EntityFramework.MySql.csproj
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ net5.0
+
+ Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application.
+ This package provides Entity Framework Core migrations for the MySql database provider.
+
+ elsa, workflows, efcore, mysql, mariadb
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/FodyWeavers.xml b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.Designer.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.Designer.cs
new file mode 100644
index 000000000..fab304c63
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.Designer.cs
@@ -0,0 +1,288 @@
+//
+using System;
+using Elsa.Persistence.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Elsa.Persistence.EntityFramework.MySql.Migrations
+{
+ [DbContext(typeof(ElsaContext))]
+ [Migration("20210423213120_InitialContext")]
+ partial class InitialContext
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Relational:MaxIdentifierLength", 64)
+ .HasAnnotation("ProductVersion", "5.0.5");
+
+ modelBuilder.Entity("Elsa.Models.Bookmark", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityType")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("Hash")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("Model")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("ModelType")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("WorkflowInstanceId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ActivityId")
+ .HasDatabaseName("IX_Bookmark_ActivityId");
+
+ b.HasIndex("ActivityType")
+ .HasDatabaseName("IX_Bookmark_ActivityType");
+
+ 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.ToTable("Bookmarks");
+ });
+
+ modelBuilder.Entity("Elsa.Models.WorkflowDefinition", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("DefinitionId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("DeleteCompletedInstances")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Description")
+ .HasColumnType("longtext");
+
+ b.Property("DisplayName")
+ .HasColumnType("longtext");
+
+ b.Property("IsLatest")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsPublished")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsSingleton")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .HasColumnType("varchar(255)");
+
+ b.Property("PersistenceBehavior")
+ .HasColumnType("int");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ 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("TenantId")
+ .HasDatabaseName("IX_WorkflowDefinition_TenantId");
+
+ b.HasIndex("Version")
+ .HasDatabaseName("IX_WorkflowDefinition_Version");
+
+ b.HasIndex("DefinitionId", "Version")
+ .HasDatabaseName("IX_WorkflowDefinition_DefinitionId_VersionId");
+
+ b.ToTable("WorkflowDefinitions");
+ });
+
+ modelBuilder.Entity("Elsa.Models.WorkflowExecutionLogRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityType")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("EventName")
+ .HasColumnType("longtext");
+
+ b.Property("Message")
+ .HasColumnType("longtext");
+
+ b.Property("Source")
+ .HasColumnType("longtext");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Timestamp")
+ .HasColumnType("datetime(6)");
+
+ b.Property("WorkflowInstanceId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ActivityId")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_ActivityId");
+
+ b.HasIndex("ActivityType")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_ActivityType");
+
+ b.HasIndex("TenantId")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_TenantId");
+
+ b.HasIndex("Timestamp")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_Timestamp");
+
+ b.HasIndex("WorkflowInstanceId")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowInstanceId");
+
+ b.ToTable("WorkflowExecutionLogRecords");
+ });
+
+ modelBuilder.Entity("Elsa.Models.WorkflowInstance", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CancelledAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ContextId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("ContextType")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CorrelationId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("DefinitionId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("FaultedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("FinishedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LastExecutedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Name")
+ .HasColumnType("varchar(255)");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ b.Property("WorkflowStatus")
+ .HasColumnType("int");
+
+ 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", "Version")
+ .HasDatabaseName("IX_WorkflowInstance_WorkflowStatus_DefinitionId_Version");
+
+ b.ToTable("WorkflowInstances");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.cs
new file mode 100644
index 000000000..b383c04da
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.cs
@@ -0,0 +1,260 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Elsa.Persistence.EntityFramework.MySql.Migrations
+{
+ public partial class InitialContext : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AlterDatabase()
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateTable(
+ name: "Bookmarks",
+ columns: table => new
+ {
+ Id = table.Column(type: "varchar(255)", nullable: false),
+ TenantId = table.Column(type: "varchar(255)", nullable: true),
+ Hash = table.Column(type: "varchar(255)", nullable: false),
+ Model = table.Column(type: "longtext", nullable: false),
+ ModelType = table.Column(type: "longtext", nullable: false),
+ ActivityType = table.Column(type: "varchar(255)", nullable: false),
+ ActivityId = table.Column(type: "varchar(255)", nullable: false),
+ WorkflowInstanceId = table.Column(type: "varchar(255)", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Bookmarks", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowDefinitions",
+ columns: table => new
+ {
+ Id = table.Column(type: "varchar(255)", nullable: false),
+ DefinitionId = table.Column(type: "varchar(255)", nullable: false),
+ TenantId = table.Column(type: "varchar(255)", nullable: true),
+ Name = table.Column(type: "varchar(255)", nullable: true),
+ DisplayName = table.Column(type: "longtext", nullable: true),
+ Description = table.Column(type: "longtext", nullable: true),
+ Version = table.Column(type: "int", nullable: false),
+ IsSingleton = table.Column(type: "tinyint(1)", nullable: false),
+ PersistenceBehavior = table.Column(type: "int", nullable: false),
+ DeleteCompletedInstances = table.Column(type: "tinyint(1)", nullable: false),
+ IsPublished = table.Column(type: "tinyint(1)", nullable: false),
+ IsLatest = table.Column(type: "tinyint(1)", nullable: false),
+ Data = table.Column(type: "longtext", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowDefinitions", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowExecutionLogRecords",
+ columns: table => new
+ {
+ Id = table.Column(type: "varchar(255)", nullable: false),
+ TenantId = table.Column(type: "varchar(255)", nullable: true),
+ WorkflowInstanceId = table.Column(type: "varchar(255)", nullable: false),
+ ActivityId = table.Column(type: "varchar(255)", nullable: false),
+ ActivityType = table.Column(type: "varchar(255)", nullable: false),
+ Timestamp = table.Column(type: "datetime(6)", nullable: false),
+ EventName = table.Column(type: "longtext", nullable: true),
+ Message = table.Column(type: "longtext", nullable: true),
+ Source = table.Column(type: "longtext", nullable: true),
+ Data = table.Column(type: "longtext", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowExecutionLogRecords", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowInstances",
+ columns: table => new
+ {
+ Id = table.Column(type: "varchar(255)", nullable: false),
+ DefinitionId = table.Column(type: "varchar(255)", nullable: false),
+ TenantId = table.Column(type: "varchar(255)", nullable: true),
+ Version = table.Column(type: "int", nullable: false),
+ WorkflowStatus = table.Column(type: "int", nullable: false),
+ CorrelationId = table.Column(type: "varchar(255)", nullable: true),
+ ContextType = table.Column(type: "varchar(255)", nullable: true),
+ ContextId = table.Column(type: "varchar(255)", nullable: true),
+ Name = table.Column(type: "varchar(255)", nullable: true),
+ CreatedAt = table.Column(type: "datetime(6)", nullable: false),
+ LastExecutedAt = table.Column(type: "datetime(6)", nullable: true),
+ FinishedAt = table.Column(type: "datetime(6)", nullable: true),
+ CancelledAt = table.Column(type: "datetime(6)", nullable: true),
+ FaultedAt = table.Column(type: "datetime(6)", nullable: true),
+ Data = table.Column(type: "longtext", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowInstances", x => x.Id);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_ActivityId",
+ table: "Bookmarks",
+ column: "ActivityId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_ActivityType",
+ table: "Bookmarks",
+ column: "ActivityType");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_ActivityType_TenantId_Hash",
+ table: "Bookmarks",
+ columns: new[] { "ActivityType", "TenantId", "Hash" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_Hash",
+ table: "Bookmarks",
+ column: "Hash");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_TenantId",
+ table: "Bookmarks",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Bookmark_WorkflowInstanceId",
+ table: "Bookmarks",
+ column: "WorkflowInstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_DefinitionId_VersionId",
+ table: "WorkflowDefinitions",
+ columns: new[] { "DefinitionId", "Version" });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_IsLatest",
+ table: "WorkflowDefinitions",
+ column: "IsLatest");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_IsPublished",
+ table: "WorkflowDefinitions",
+ column: "IsPublished");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_Name",
+ table: "WorkflowDefinitions",
+ column: "Name");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_TenantId",
+ table: "WorkflowDefinitions",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowDefinition_Version",
+ table: "WorkflowDefinitions",
+ column: "Version");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_ActivityId",
+ table: "WorkflowExecutionLogRecords",
+ column: "ActivityId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_ActivityType",
+ table: "WorkflowExecutionLogRecords",
+ column: "ActivityType");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_TenantId",
+ table: "WorkflowExecutionLogRecords",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_Timestamp",
+ table: "WorkflowExecutionLogRecords",
+ column: "Timestamp");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowExecutionLogRecord_WorkflowInstanceId",
+ table: "WorkflowExecutionLogRecords",
+ column: "WorkflowInstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_ContextId",
+ table: "WorkflowInstances",
+ column: "ContextId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_ContextType",
+ table: "WorkflowInstances",
+ column: "ContextType");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_CorrelationId",
+ table: "WorkflowInstances",
+ column: "CorrelationId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_CreatedAt",
+ table: "WorkflowInstances",
+ column: "CreatedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_DefinitionId",
+ table: "WorkflowInstances",
+ column: "DefinitionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_FaultedAt",
+ table: "WorkflowInstances",
+ column: "FaultedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_FinishedAt",
+ table: "WorkflowInstances",
+ column: "FinishedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_LastExecutedAt",
+ table: "WorkflowInstances",
+ column: "LastExecutedAt");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_Name",
+ table: "WorkflowInstances",
+ column: "Name");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_TenantId",
+ table: "WorkflowInstances",
+ column: "TenantId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_WorkflowStatus",
+ table: "WorkflowInstances",
+ column: "WorkflowStatus");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_WorkflowInstance_WorkflowStatus_DefinitionId_Version",
+ table: "WorkflowInstances",
+ columns: new[] { "WorkflowStatus", "DefinitionId", "Version" });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Bookmarks");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowDefinitions");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowExecutionLogRecords");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowInstances");
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/ElsaContextModelSnapshot.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/ElsaContextModelSnapshot.cs
new file mode 100644
index 000000000..e3afb472a
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/ElsaContextModelSnapshot.cs
@@ -0,0 +1,286 @@
+//
+using System;
+using Elsa.Persistence.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Elsa.Persistence.EntityFramework.MySql.Migrations
+{
+ [DbContext(typeof(ElsaContext))]
+ partial class ElsaContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Relational:MaxIdentifierLength", 64)
+ .HasAnnotation("ProductVersion", "5.0.5");
+
+ modelBuilder.Entity("Elsa.Models.Bookmark", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityType")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("Hash")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("Model")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("ModelType")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("WorkflowInstanceId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ActivityId")
+ .HasDatabaseName("IX_Bookmark_ActivityId");
+
+ b.HasIndex("ActivityType")
+ .HasDatabaseName("IX_Bookmark_ActivityType");
+
+ 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.ToTable("Bookmarks");
+ });
+
+ modelBuilder.Entity("Elsa.Models.WorkflowDefinition", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("DefinitionId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("DeleteCompletedInstances")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Description")
+ .HasColumnType("longtext");
+
+ b.Property("DisplayName")
+ .HasColumnType("longtext");
+
+ b.Property("IsLatest")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsPublished")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsSingleton")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .HasColumnType("varchar(255)");
+
+ b.Property("PersistenceBehavior")
+ .HasColumnType("int");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ 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("TenantId")
+ .HasDatabaseName("IX_WorkflowDefinition_TenantId");
+
+ b.HasIndex("Version")
+ .HasDatabaseName("IX_WorkflowDefinition_Version");
+
+ b.HasIndex("DefinitionId", "Version")
+ .HasDatabaseName("IX_WorkflowDefinition_DefinitionId_VersionId");
+
+ b.ToTable("WorkflowDefinitions");
+ });
+
+ modelBuilder.Entity("Elsa.Models.WorkflowExecutionLogRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("ActivityType")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("EventName")
+ .HasColumnType("longtext");
+
+ b.Property("Message")
+ .HasColumnType("longtext");
+
+ b.Property("Source")
+ .HasColumnType("longtext");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Timestamp")
+ .HasColumnType("datetime(6)");
+
+ b.Property("WorkflowInstanceId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ActivityId")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_ActivityId");
+
+ b.HasIndex("ActivityType")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_ActivityType");
+
+ b.HasIndex("TenantId")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_TenantId");
+
+ b.HasIndex("Timestamp")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_Timestamp");
+
+ b.HasIndex("WorkflowInstanceId")
+ .HasDatabaseName("IX_WorkflowExecutionLogRecord_WorkflowInstanceId");
+
+ b.ToTable("WorkflowExecutionLogRecords");
+ });
+
+ modelBuilder.Entity("Elsa.Models.WorkflowInstance", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CancelledAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ContextId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("ContextType")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CorrelationId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Data")
+ .HasColumnType("longtext");
+
+ b.Property("DefinitionId")
+ .IsRequired()
+ .HasColumnType("varchar(255)");
+
+ b.Property("FaultedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("FinishedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LastExecutedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Name")
+ .HasColumnType("varchar(255)");
+
+ b.Property("TenantId")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ b.Property("WorkflowStatus")
+ .HasColumnType("int");
+
+ 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", "Version")
+ .HasDatabaseName("IX_WorkflowInstance_WorkflowStatus_DefinitionId_Version");
+
+ b.ToTable("WorkflowInstances");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/MySqlElsaContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/MySqlElsaContextFactory.cs
new file mode 100644
index 000000000..a1b4591a1
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/MySqlElsaContextFactory.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Linq;
+using Elsa.Persistence.EntityFramework.Core;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using Pomelo.EntityFrameworkCore.MySql.Infrastructure;
+namespace Elsa.Persistence.EntityFramework.MySql
+{
+ public class MySqlElsaContextFactory : IDesignTimeDbContextFactory
+ {
+ public ElsaContext CreateDbContext(string[] args)
+ {
+ var builder = new DbContextOptionsBuilder();
+ var connectionString = args.Any() ? args[0] : throw new InvalidOperationException("Please specify a connection string. E.g. dotnet ef database update -- \"Server=localhost;Port=3306;Database=elsa;User=root;Password=password\"");
+ builder.UseMySql(
+ connectionString,
+ ServerVersion.AutoDetect(args[0]),
+ db => db.MigrationsAssembly(typeof(MySqlElsaContextFactory).Assembly.GetName().Name));
+ return new ElsaContext(builder.Options);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Readme.md b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Readme.md
new file mode 100644
index 000000000..f0bc5a476
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Readme.md
@@ -0,0 +1,49 @@
+### Usage
+
+```
+public void ConfigureServices(IServiceCollection services)
+{
+
+ services.AddElsa(elsa =>
+ elsa
+ .AddWorkflow()
+ .UseEntityFrameworkPersistence(
+ contextOptions =>
+ {
+ contextOptions.UseMySql(
+ "Server=localhost;Port=3306;Database=elsa;User=root;Password=password;");
+ },
+ autoRunMigrations: true)
+ );
+}
+```
+
+### Entity Framework Core Commands
+
+These commands are used by the package developer.
+
+**Generate Migrations**
+
+```
+dotnet ef migrations add Initial
+dotnet ef migrations add Update1
+dotnet ef migrations add Update2
+```
+
+etc..
+
+Optionally, specify a connection string:
+
+```
+dotnet ef migrations add Initial -- "{connection string}"
+dotnet ef migrations add Update1 -- "{connection string}"
+dotnet ef migrations add Update2 -- "{connection string}"
+```
+
+**Apply Migrations**
+
+
+This
+
+`dotnet ef database update -- "{connection string}"`
+
diff --git a/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Elsa.Samples.Persistence.EntityFramework.csproj b/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Elsa.Samples.Persistence.EntityFramework.csproj
index 90e039a8f..7de4c8ee2 100644
--- a/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Elsa.Samples.Persistence.EntityFramework.csproj
+++ b/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Elsa.Samples.Persistence.EntityFramework.csproj
@@ -12,6 +12,7 @@
+
diff --git a/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Program.cs b/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Program.cs
index 76806cd9a..ee08ba59c 100644
--- a/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Program.cs
+++ b/src/samples/persistence/Elsa.Samples.Persistence.EntityFramework/Program.cs
@@ -23,6 +23,8 @@ namespace Elsa.Samples.Persistence.EntityFramework
//ef.UsePostgreSql("Server=127.0.0.1;Port=5432;Database=elsa;User Id=postgres;Password=password;");
+ //ef.UseMySql("Server=localhost;Port=3306;Database=elsa;User=root;Password=password;");
+
ef.UseSqlServer("Server=localhost;Database=Elsa;Integrated Security=true");
})
.AddConsoleActivities()