From 8f429a5cc176fbdfde398025a7da20dcab7c788a Mon Sep 17 00:00:00 2001 From: Erol Keskin Date: Sat, 24 Apr 2021 01:28:20 +0300 Subject: [PATCH] Add MySql EntityFramework Provider --- .../DbContextOptionsBuilderExtensions.cs | 16 + ...a.Persistence.EntityFramework.MySql.csproj | 28 ++ .../FodyWeavers.xml | 3 + .../20210423213120_InitialContext.Designer.cs | 288 ++++++++++++++++++ .../20210423213120_InitialContext.cs | 260 ++++++++++++++++ .../Migrations/ElsaContextModelSnapshot.cs | 286 +++++++++++++++++ .../MySqlElsaContextFactory.cs | 22 ++ .../Readme.md | 49 +++ ...Samples.Persistence.EntityFramework.csproj | 1 + .../Program.cs | 2 + 10 files changed, 955 insertions(+) create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/DbContextOptionsBuilderExtensions.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Elsa.Persistence.EntityFramework.MySql.csproj create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/FodyWeavers.xml create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.Designer.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/20210423213120_InitialContext.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Migrations/ElsaContextModelSnapshot.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/MySqlElsaContextFactory.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFramework/Elsa.Persistence.EntityFramework.MySql/Readme.md 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()