diff --git a/Samples.sln b/Samples.sln
index 4f6eb3773..864cc4ffa 100644
--- a/Samples.sln
+++ b/Samples.sln
@@ -118,6 +118,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample21", "src\samples\Sam
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Dashboard.Web", "src\dashboard\Elsa.Dashboard.Web\Elsa.Dashboard.Web.csproj", "{AE0363D2-3630-4CDD-86A1-7D6A717361BD}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample22", "src\samples\Sample22\Sample22.csproj", "{BE634D4E-73A1-48CE-8682-F548CA0BA5B6}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -300,6 +302,10 @@ Global
{AE0363D2-3630-4CDD-86A1-7D6A717361BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AE0363D2-3630-4CDD-86A1-7D6A717361BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AE0363D2-3630-4CDD-86A1-7D6A717361BD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE634D4E-73A1-48CE-8682-F548CA0BA5B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BE634D4E-73A1-48CE-8682-F548CA0BA5B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE634D4E-73A1-48CE-8682-F548CA0BA5B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BE634D4E-73A1-48CE-8682-F548CA0BA5B6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -356,6 +362,7 @@ Global
{9B238B75-5A68-48B1-973A-59F0EFAB0A8B} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{6BA81F4E-2B17-4C7B-ACB1-6588B0315582} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
{AE0363D2-3630-4CDD-86A1-7D6A717361BD} = {0DF567E8-2A21-4A1C-90E8-025F1EC615F3}
+ {BE634D4E-73A1-48CE-8682-F548CA0BA5B6} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}
diff --git a/Samples.sln.DotSettings b/Samples.sln.DotSettings
index 5c438ec70..4d25f828b 100644
--- a/Samples.sln.DotSettings
+++ b/Samples.sln.DotSettings
@@ -4,4 +4,5 @@
True
True
True
- True
\ No newline at end of file
+ True
+ True
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/ElsaContext.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/ElsaContext.cs
similarity index 96%
rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/ElsaContext.cs
rename to src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/ElsaContext.cs
index 84ce5fbe6..4c9fdef51 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/ElsaContext.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/ElsaContext.cs
@@ -1,143 +1,143 @@
-using System.Collections.Generic;
-using Elsa.Models;
-using Elsa.Persistence.EntityFrameworkCore.Entities;
-using Microsoft.EntityFrameworkCore;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using NodaTime;
-using NodaTime.Serialization.JsonNet;
-
-namespace Elsa.Persistence.EntityFrameworkCore
-{
- public class ElsaContext : DbContext
- {
- private readonly JsonSerializerSettings serializerSettings;
-
- public ElsaContext(DbContextOptions options) : base(options)
- {
- serializerSettings = new JsonSerializerSettings().ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
- }
-
- public DbSet WorkflowDefinitionVersions { get; set; }
- public DbSet WorkflowInstances { get; set; }
- public DbSet ActivityDefinitions { get; set; }
- public DbSet ConnectionDefinitions { get; set; }
- public DbSet ActivityInstances { get; set; }
- public DbSet BlockingActivities { get; set; }
-
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- base.OnModelCreating(modelBuilder);
- ConfigureWorkflowDefinitionVersion(modelBuilder);
- ConfigureWorkflowInstance(modelBuilder);
- ConfigureActivityDefinition(modelBuilder);
- ConfigureActivityInstance(modelBuilder);
- ConfigureBlockingActivity(modelBuilder);
- }
-
- private void ConfigureWorkflowDefinitionVersion(ModelBuilder modelBuilder)
- {
- var entity = modelBuilder.Entity();
-
- entity.HasKey(x => x.Id);
- entity.Property(x => x.DefinitionId);
- entity.Property(x => x.Variables).HasConversion(x => Serialize(x), x => Deserialize(x));
- entity.HasMany(x => x.Activities).WithOne(x => x.WorkflowDefinitionVersion);
- entity.HasMany(x => x.Connections).WithOne(x => x.WorkflowDefinitionVersion);
- }
-
- private void ConfigureWorkflowInstance(ModelBuilder modelBuilder)
- {
- var entity = modelBuilder.Entity();
-
- entity.HasKey(x => x.Id);
- entity.Property(x => x.Status).HasConversion();
-
- entity
- .Property(x => x.Scopes)
- .HasConversion(
- x => Serialize(x),
- x => Deserialize>(x)
- );
-
- entity
- .Property(x => x.ExecutionLog)
- .HasConversion(
- x => Serialize(x),
- x => Deserialize>(x)
- );
-
- entity
- .Property(x => x.Fault)
- .HasConversion(
- x => Serialize(x),
- x => Deserialize(x)
- );
-
- entity
- .Property(x => x.Input)
- .HasConversion(
- x => Serialize(x),
- x => Deserialize(x)
- );
-
- entity
- .HasMany(x => x.Activities)
- .WithOne(x => x.WorkflowInstance);
-
- entity
- .HasMany(x => x.BlockingActivities)
- .WithOne(x => x.WorkflowInstance);
- }
-
- private void ConfigureActivityDefinition(ModelBuilder modelBuilder)
- {
- var entity = modelBuilder.Entity();
-
- entity.HasKey(x => x.Id);
-
- entity
- .Property(x => x.State)
- .HasConversion(x => Serialize(x), x => Deserialize(x));
- }
-
- private void ConfigureConnectionDefinition(ModelBuilder modelBuilder)
- {
- var entity = modelBuilder.Entity();
-
- entity.HasKey(x => x.Id);
- }
-
- private void ConfigureActivityInstance(ModelBuilder modelBuilder)
- {
- var entity = modelBuilder.Entity();
-
- entity.HasKey(x => x.Id);
-
- entity
- .Property(x => x.State)
- .HasConversion(x => Serialize(x), x => Deserialize(x));
-
- entity
- .Property(x => x.Output)
- .HasConversion(x => Serialize(x), x => Deserialize(x));
- }
-
- private void ConfigureBlockingActivity(ModelBuilder modelBuilder)
- {
- var entity = modelBuilder.Entity();
-
- entity.HasKey(x => x.Id);
- }
-
- private string Serialize(object value)
- {
- return JsonConvert.SerializeObject(value, serializerSettings);
- }
-
- private T Deserialize(string json)
- {
- return JsonConvert.DeserializeObject(json, serializerSettings);
- }
- }
+using System.Collections.Generic;
+using Elsa.Models;
+using Elsa.Persistence.EntityFrameworkCore.Entities;
+using Microsoft.EntityFrameworkCore;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using NodaTime;
+using NodaTime.Serialization.JsonNet;
+
+namespace Elsa.Persistence.EntityFrameworkCore.DbContexts
+{
+ public class ElsaContext : DbContext
+ {
+ private readonly JsonSerializerSettings serializerSettings;
+
+ public ElsaContext(DbContextOptions options) : base(options)
+ {
+ serializerSettings = new JsonSerializerSettings().ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
+ }
+
+ public DbSet WorkflowDefinitionVersions { get; set; }
+ public DbSet WorkflowInstances { get; set; }
+ public DbSet ActivityDefinitions { get; set; }
+ public DbSet ConnectionDefinitions { get; set; }
+ public DbSet ActivityInstances { get; set; }
+ public DbSet BlockingActivities { get; set; }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+ ConfigureWorkflowDefinitionVersion(modelBuilder);
+ ConfigureWorkflowInstance(modelBuilder);
+ ConfigureActivityDefinition(modelBuilder);
+ ConfigureActivityInstance(modelBuilder);
+ ConfigureBlockingActivity(modelBuilder);
+ }
+
+ private void ConfigureWorkflowDefinitionVersion(ModelBuilder modelBuilder)
+ {
+ var entity = modelBuilder.Entity();
+
+ entity.HasKey(x => x.Id);
+ entity.Property(x => x.DefinitionId);
+ entity.Property(x => x.Variables).HasConversion(x => Serialize(x), x => Deserialize(x));
+ entity.HasMany(x => x.Activities).WithOne(x => x.WorkflowDefinitionVersion);
+ entity.HasMany(x => x.Connections).WithOne(x => x.WorkflowDefinitionVersion);
+ }
+
+ private void ConfigureWorkflowInstance(ModelBuilder modelBuilder)
+ {
+ var entity = modelBuilder.Entity();
+
+ entity.HasKey(x => x.Id);
+ entity.Property(x => x.Status).HasConversion();
+
+ entity
+ .Property(x => x.Scopes)
+ .HasConversion(
+ x => Serialize(x),
+ x => Deserialize>(x)
+ );
+
+ entity
+ .Property(x => x.ExecutionLog)
+ .HasConversion(
+ x => Serialize(x),
+ x => Deserialize>(x)
+ );
+
+ entity
+ .Property(x => x.Fault)
+ .HasConversion(
+ x => Serialize(x),
+ x => Deserialize(x)
+ );
+
+ entity
+ .Property(x => x.Input)
+ .HasConversion(
+ x => Serialize(x),
+ x => Deserialize(x)
+ );
+
+ entity
+ .HasMany(x => x.Activities)
+ .WithOne(x => x.WorkflowInstance);
+
+ entity
+ .HasMany(x => x.BlockingActivities)
+ .WithOne(x => x.WorkflowInstance);
+ }
+
+ private void ConfigureActivityDefinition(ModelBuilder modelBuilder)
+ {
+ var entity = modelBuilder.Entity();
+
+ entity.HasKey(x => x.Id);
+
+ entity
+ .Property(x => x.State)
+ .HasConversion(x => Serialize(x), x => Deserialize(x));
+ }
+
+ private void ConfigureConnectionDefinition(ModelBuilder modelBuilder)
+ {
+ var entity = modelBuilder.Entity();
+
+ entity.HasKey(x => x.Id);
+ }
+
+ private void ConfigureActivityInstance(ModelBuilder modelBuilder)
+ {
+ var entity = modelBuilder.Entity();
+
+ entity.HasKey(x => x.Id);
+
+ entity
+ .Property(x => x.State)
+ .HasConversion(x => Serialize(x), x => Deserialize(x));
+
+ entity
+ .Property(x => x.Output)
+ .HasConversion(x => Serialize(x), x => Deserialize(x));
+ }
+
+ private void ConfigureBlockingActivity(ModelBuilder modelBuilder)
+ {
+ var entity = modelBuilder.Entity();
+
+ entity.HasKey(x => x.Id);
+ }
+
+ private string Serialize(object value)
+ {
+ return JsonConvert.SerializeObject(value, serializerSettings);
+ }
+
+ private T Deserialize(string json)
+ {
+ return JsonConvert.DeserializeObject(json, serializerSettings);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContext.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContext.cs
new file mode 100644
index 000000000..c6f1b3089
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContext.cs
@@ -0,0 +1,11 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace Elsa.Persistence.EntityFrameworkCore.DbContexts
+{
+ public class SqlServerContext : ElsaContext
+ {
+ public SqlServerContext(DbContextOptions options) : base(options)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContextFactory.cs
new file mode 100644
index 000000000..e7eb5813d
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContextFactory.cs
@@ -0,0 +1,26 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+
+namespace Elsa.Persistence.EntityFrameworkCore.DbContexts
+{
+ public class SqlServerContextFactory : IDesignTimeDbContextFactory
+ {
+ public SqlServerContext CreateDbContext(string[] args)
+ {
+ var optionsBuilder = new DbContextOptionsBuilder();
+ var migrationAssembly = typeof(ElsaContext).Assembly.FullName;
+ var connectionString = Environment.GetEnvironmentVariable("EF_CONNECTIONSTRING");
+
+ if(connectionString == null)
+ throw new InvalidOperationException("Set the EF_CONNECTIONSTRING environment variable to a valid SQL Server connection string. E.g. SET EF_CONNECTIONSTRING=Server=localhost;Database=Elsa;User=sa;Password=Secret_password123!;");
+
+ optionsBuilder.UseSqlServer(
+ connectionString,
+ x => x.MigrationsAssembly(migrationAssembly)
+ );
+
+ return new SqlServerContext(optionsBuilder.Options);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContext.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContext.cs
new file mode 100644
index 000000000..96db59220
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContext.cs
@@ -0,0 +1,11 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace Elsa.Persistence.EntityFrameworkCore.DbContexts
+{
+ public class SqliteContext : ElsaContext
+ {
+ public SqliteContext(DbContextOptions options) : base(options)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContextFactory.cs
new file mode 100644
index 000000000..548ec7f5f
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContextFactory.cs
@@ -0,0 +1,26 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+
+namespace Elsa.Persistence.EntityFrameworkCore.DbContexts
+{
+ public class SqliteContextFactory : IDesignTimeDbContextFactory
+ {
+ public SqliteContext CreateDbContext(string[] args)
+ {
+ var optionsBuilder = new DbContextOptionsBuilder();
+ var migrationAssembly = typeof(ElsaContext).Assembly.FullName;
+ var connectionString = Environment.GetEnvironmentVariable("EF_CONNECTIONSTRING");
+
+ if(connectionString == null)
+ throw new InvalidOperationException(@"Set the EF_CONNECTIONSTRING environment variable to a valid SQLite connection string. E.g. SET EF_CONNECTIONSTRING=Data Source=c:\data\elsa.db;Cache=Shared;");
+
+ optionsBuilder.UseSqlite(
+ connectionString,
+ x => x.MigrationsAssembly(migrationAssembly)
+ );
+
+ return new SqliteContext(optionsBuilder.Options);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/DesignTimeElsaContextFactory.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/DesignTimeElsaContextFactory.cs
deleted file mode 100644
index b859885a0..000000000
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/DesignTimeElsaContextFactory.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Design;
-
-namespace Elsa.Persistence.EntityFrameworkCore
-{
- public class DesignTimeElsaContextFactory : IDesignTimeDbContextFactory
- {
- public ElsaContext CreateDbContext(string[] args)
- {
- var optionsBuilder = new DbContextOptionsBuilder();
- var migrationAssembly = typeof(DesignTimeElsaContextFactory).Assembly.FullName;
- var provider = Environment.GetEnvironmentVariable("EF_PROVIDER") ?? "Sqlite";
- var connectionString = Environment.GetEnvironmentVariable("EF_CONNECTIONSTRING") ?? "Data Source=c:\\data\\elsa.db;Cache=Shared";
-
- switch (provider)
- {
- case "Sqlite":
- optionsBuilder.UseSqlite(
- connectionString,
- x => x.MigrationsAssembly(migrationAssembly)
- );
- break;
- case "SqlServer":
- optionsBuilder.UseSqlServer(
- connectionString,
- x => x.MigrationsAssembly(migrationAssembly)
- );
- break;
- default:
- throw new NotSupportedException("The specified provider is not supported.");
- }
-
- return new ElsaContext(optionsBuilder.Options);
- }
- }
-}
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/EFCoreServiceCollectionExtensions.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/EFCoreServiceCollectionExtensions.cs
index ba84727bf..991021f94 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/EFCoreServiceCollectionExtensions.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Extensions/EFCoreServiceCollectionExtensions.cs
@@ -1,6 +1,7 @@
using System;
using Elsa.AutoMapper.Extensions;
using Elsa.AutoMapper.Extensions.NodaTime;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Elsa.Persistence.EntityFrameworkCore.Mapping;
using Elsa.Persistence.EntityFrameworkCore.Services;
using Microsoft.EntityFrameworkCore;
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.Designer.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.Designer.cs
new file mode 100644
index 000000000..3b49f31de
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.Designer.cs
@@ -0,0 +1,261 @@
+//
+using System;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Elsa.Persistence.EntityFrameworkCore.Migrations.SqlServer
+{
+ [DbContext(typeof(SqlServerContext))]
+ [Migration("20191126215035_InitialCreate")]
+ partial class InitialCreate
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityDefinitionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Left")
+ .HasColumnType("int");
+
+ b.Property("State")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Top")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowDefinitionVersionId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowDefinitionVersionId");
+
+ b.ToTable("ActivityDefinitions");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityInstanceEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Output")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("State")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Type")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowInstanceId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowInstanceId");
+
+ b.ToTable("ActivityInstances");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.BlockingActivityEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ActivityType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowInstanceId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowInstanceId");
+
+ b.ToTable("BlockingActivities");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ConnectionDefinitionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("DestinationActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Outcome")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("SourceActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowDefinitionVersionId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowDefinitionVersionId");
+
+ b.ToTable("ConnectionDefinitions");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("DefinitionId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("IsDisabled")
+ .HasColumnType("bit");
+
+ b.Property("IsLatest")
+ .HasColumnType("bit");
+
+ b.Property("IsPublished")
+ .HasColumnType("bit");
+
+ b.Property("IsSingleton")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Variables")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ b.Property("VersionId")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("WorkflowDefinitionVersions");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("AbortedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("CorrelationId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("DefinitionId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ExecutionLog")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Fault")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FaultedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("FinishedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("Input")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("InstanceId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Scopes")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("StartedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("WorkflowInstances");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityDefinitionEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", "WorkflowDefinitionVersion")
+ .WithMany("Activities")
+ .HasForeignKey("WorkflowDefinitionVersionId");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityInstanceEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", "WorkflowInstance")
+ .WithMany("Activities")
+ .HasForeignKey("WorkflowInstanceId");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.BlockingActivityEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", "WorkflowInstance")
+ .WithMany("BlockingActivities")
+ .HasForeignKey("WorkflowInstanceId");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ConnectionDefinitionEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", "WorkflowDefinitionVersion")
+ .WithMany("Connections")
+ .HasForeignKey("WorkflowDefinitionVersionId");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.cs
new file mode 100644
index 000000000..e0fcb4e9c
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.cs
@@ -0,0 +1,190 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Elsa.Persistence.EntityFrameworkCore.Migrations.SqlServer
+{
+ public partial class InitialCreate : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "WorkflowDefinitionVersions",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ VersionId = table.Column(nullable: true),
+ DefinitionId = table.Column(nullable: true),
+ Version = table.Column(nullable: false),
+ Name = table.Column(nullable: true),
+ Description = table.Column(nullable: true),
+ Variables = table.Column(nullable: true),
+ IsSingleton = table.Column(nullable: false),
+ IsDisabled = table.Column(nullable: false),
+ IsPublished = table.Column(nullable: false),
+ IsLatest = table.Column(nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowDefinitionVersions", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "WorkflowInstances",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ InstanceId = table.Column(nullable: true),
+ DefinitionId = table.Column(nullable: true),
+ Version = table.Column(nullable: false),
+ Status = table.Column(nullable: false),
+ CorrelationId = table.Column(nullable: true),
+ CreatedAt = table.Column(nullable: false),
+ StartedAt = table.Column(nullable: true),
+ FinishedAt = table.Column(nullable: true),
+ FaultedAt = table.Column(nullable: true),
+ AbortedAt = table.Column(nullable: true),
+ Scopes = table.Column(nullable: true),
+ Input = table.Column(nullable: true),
+ ExecutionLog = table.Column(nullable: true),
+ Fault = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_WorkflowInstances", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ActivityDefinitions",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ ActivityId = table.Column(nullable: true),
+ WorkflowDefinitionVersionId = table.Column(nullable: true),
+ Type = table.Column(nullable: true),
+ Left = table.Column(nullable: false),
+ Top = table.Column(nullable: false),
+ State = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ActivityDefinitions", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ActivityDefinitions_WorkflowDefinitionVersions_WorkflowDefinitionVersionId",
+ column: x => x.WorkflowDefinitionVersionId,
+ principalTable: "WorkflowDefinitionVersions",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ConnectionDefinitions",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ WorkflowDefinitionVersionId = table.Column(nullable: true),
+ SourceActivityId = table.Column(nullable: true),
+ DestinationActivityId = table.Column(nullable: true),
+ Outcome = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ConnectionDefinitions", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ConnectionDefinitions_WorkflowDefinitionVersions_WorkflowDefinitionVersionId",
+ column: x => x.WorkflowDefinitionVersionId,
+ principalTable: "WorkflowDefinitionVersions",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "ActivityInstances",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ ActivityId = table.Column(nullable: true),
+ WorkflowInstanceId = table.Column(nullable: true),
+ Type = table.Column(nullable: true),
+ State = table.Column(nullable: true),
+ Output = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ActivityInstances", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ActivityInstances_WorkflowInstances_WorkflowInstanceId",
+ column: x => x.WorkflowInstanceId,
+ principalTable: "WorkflowInstances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "BlockingActivities",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ WorkflowInstanceId = table.Column(nullable: true),
+ ActivityId = table.Column(nullable: true),
+ ActivityType = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BlockingActivities", x => x.Id);
+ table.ForeignKey(
+ name: "FK_BlockingActivities_WorkflowInstances_WorkflowInstanceId",
+ column: x => x.WorkflowInstanceId,
+ principalTable: "WorkflowInstances",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ActivityDefinitions_WorkflowDefinitionVersionId",
+ table: "ActivityDefinitions",
+ column: "WorkflowDefinitionVersionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ActivityInstances_WorkflowInstanceId",
+ table: "ActivityInstances",
+ column: "WorkflowInstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BlockingActivities_WorkflowInstanceId",
+ table: "BlockingActivities",
+ column: "WorkflowInstanceId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ConnectionDefinitions_WorkflowDefinitionVersionId",
+ table: "ConnectionDefinitions",
+ column: "WorkflowDefinitionVersionId");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "ActivityDefinitions");
+
+ migrationBuilder.DropTable(
+ name: "ActivityInstances");
+
+ migrationBuilder.DropTable(
+ name: "BlockingActivities");
+
+ migrationBuilder.DropTable(
+ name: "ConnectionDefinitions");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowInstances");
+
+ migrationBuilder.DropTable(
+ name: "WorkflowDefinitionVersions");
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/SqlServerContextModelSnapshot.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/SqlServerContextModelSnapshot.cs
new file mode 100644
index 000000000..eb061c8ba
--- /dev/null
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/SqlServerContextModelSnapshot.cs
@@ -0,0 +1,259 @@
+//
+using System;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Elsa.Persistence.EntityFrameworkCore.Migrations.SqlServer
+{
+ [DbContext(typeof(SqlServerContext))]
+ partial class SqlServerContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityDefinitionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Left")
+ .HasColumnType("int");
+
+ b.Property("State")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Top")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowDefinitionVersionId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowDefinitionVersionId");
+
+ b.ToTable("ActivityDefinitions");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityInstanceEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Output")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("State")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Type")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowInstanceId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowInstanceId");
+
+ b.ToTable("ActivityInstances");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.BlockingActivityEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("ActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ActivityType")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowInstanceId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowInstanceId");
+
+ b.ToTable("BlockingActivities");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ConnectionDefinitionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("DestinationActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Outcome")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("SourceActivityId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("WorkflowDefinitionVersionId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WorkflowDefinitionVersionId");
+
+ b.ToTable("ConnectionDefinitions");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("DefinitionId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Description")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("IsDisabled")
+ .HasColumnType("bit");
+
+ b.Property("IsLatest")
+ .HasColumnType("bit");
+
+ b.Property("IsPublished")
+ .HasColumnType("bit");
+
+ b.Property("IsSingleton")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Variables")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ b.Property("VersionId")
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("WorkflowDefinitionVersions");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ b.Property("AbortedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("CorrelationId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("DefinitionId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("ExecutionLog")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Fault")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("FaultedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("FinishedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("Input")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("InstanceId")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Scopes")
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("StartedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Version")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("WorkflowInstances");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityDefinitionEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", "WorkflowDefinitionVersion")
+ .WithMany("Activities")
+ .HasForeignKey("WorkflowDefinitionVersionId");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityInstanceEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", "WorkflowInstance")
+ .WithMany("Activities")
+ .HasForeignKey("WorkflowInstanceId");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.BlockingActivityEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", "WorkflowInstance")
+ .WithMany("BlockingActivities")
+ .HasForeignKey("WorkflowInstanceId");
+ });
+
+ modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ConnectionDefinitionEntity", b =>
+ {
+ b.HasOne("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", "WorkflowDefinitionVersion")
+ .WithMany("Connections")
+ .HasForeignKey("WorkflowDefinitionVersionId");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/20191116105145_InitialCreate.Designer.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/20191126211902_InitialCreate.Designer.cs
similarity index 95%
rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/20191116105145_InitialCreate.Designer.cs
rename to src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/20191126211902_InitialCreate.Designer.cs
index 9ffbc669b..c34e08aea 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/20191116105145_InitialCreate.Designer.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/20191126211902_InitialCreate.Designer.cs
@@ -1,26 +1,27 @@
//
using System;
-using Elsa.Persistence.EntityFrameworkCore;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-namespace Elsa.Persistence.EntityFrameworkCore.Migrations
+namespace Elsa.Persistence.EntityFrameworkCore.Migrations.Sqlite
{
- [DbContext(typeof(ElsaContext))]
- [Migration("20191116105145_InitialCreate")]
+ [DbContext(typeof(SqliteContext))]
+ [Migration("20191126211902_InitialCreate")]
partial class InitialCreate
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "3.0.0");
+ .HasAnnotation("ProductVersion", "3.0.1");
modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityDefinitionEntity", b =>
{
b.Property("Id")
+ .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property("ActivityId")
@@ -126,6 +127,7 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", b =>
{
b.Property("Id")
+ .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property("DefinitionId")
@@ -166,6 +168,7 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", b =>
{
b.Property("Id")
+ .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property("AbortedAt")
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/20191116105145_InitialCreate.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/20191126211902_InitialCreate.cs
similarity index 94%
rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/20191116105145_InitialCreate.cs
rename to src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/20191126211902_InitialCreate.cs
index a1c4f8abd..06d6d0fb0 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/20191116105145_InitialCreate.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/20191126211902_InitialCreate.cs
@@ -1,7 +1,7 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
-namespace Elsa.Persistence.EntityFrameworkCore.Migrations
+namespace Elsa.Persistence.EntityFrameworkCore.Migrations.Sqlite
{
public partial class InitialCreate : Migration
{
@@ -11,7 +11,8 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
name: "WorkflowDefinitionVersions",
columns: table => new
{
- Id = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
VersionId = table.Column(nullable: true),
DefinitionId = table.Column(nullable: true),
Version = table.Column(nullable: false),
@@ -32,7 +33,8 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
name: "WorkflowInstances",
columns: table => new
{
- Id = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
InstanceId = table.Column(nullable: true),
DefinitionId = table.Column(nullable: true),
Version = table.Column(nullable: false),
@@ -57,7 +59,8 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
name: "ActivityDefinitions",
columns: table => new
{
- Id = table.Column(nullable: false),
+ Id = table.Column(nullable: false)
+ .Annotation("Sqlite:Autoincrement", true),
ActivityId = table.Column(nullable: true),
WorkflowDefinitionVersionId = table.Column(nullable: true),
Type = table.Column(nullable: true),
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/ElsaContextModelSnapshot.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/SqliteContextModelSnapshot.cs
similarity index 94%
rename from src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/ElsaContextModelSnapshot.cs
rename to src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/SqliteContextModelSnapshot.cs
index 14aa716f3..68b9d2828 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/ElsaContextModelSnapshot.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/Sqlite/SqliteContextModelSnapshot.cs
@@ -1,22 +1,25 @@
//
using System;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-namespace Elsa.Persistence.EntityFrameworkCore.Migrations
+namespace Elsa.Persistence.EntityFrameworkCore.Migrations.Sqlite
{
- [DbContext(typeof(ElsaContext))]
- partial class ElsaContextModelSnapshot : ModelSnapshot
+ [DbContext(typeof(SqliteContext))]
+ partial class SqliteContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "3.0.0");
+ .HasAnnotation("ProductVersion", "3.0.1");
modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.ActivityDefinitionEntity", b =>
{
b.Property("Id")
+ .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property("ActivityId")
@@ -122,6 +125,7 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowDefinitionVersionEntity", b =>
{
b.Property("Id")
+ .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property("DefinitionId")
@@ -162,6 +166,7 @@ namespace Elsa.Persistence.EntityFrameworkCore.Migrations
modelBuilder.Entity("Elsa.Persistence.EntityFrameworkCore.Entities.WorkflowInstanceEntity", b =>
{
b.Property("Id")
+ .ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property("AbortedAt")
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/README.md b/src/persistence/Elsa.Persistence.EntityFrameworkCore/README.md
index 3e6ef5eb4..23f4930e8 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/README.md
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/README.md
@@ -1,9 +1,26 @@
+# Generating migrations
+
+We should generate migration sets per provider as described here: https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/providers?tabs=dotnet-core-cli
+
+Example commands:
+
+```bash
+dotnet ef migrations add InitialCreate --context SqliteContext --output-dir Migrations/Sqlite
+dotnet ef migrations add InitialCreate --context SqlServerContext --output-dir Migrations/SqlServer
+```
+
+
# Creating and updating the Sqlite database
-To create the database, run the following command from a shell:
+First, set the appropriate connection string.
+To create the database, run the migrations.
+
+Example command:
```bash
-dotnet ef database update
-```
+SET EF_CONNECTIONSTRING="Data Source=c:\data\elsa.db;Cache=Shared"
+dotnet ef database update --context SqliteContext
-> NOTE: By default, the SqLite provider is used, and will create a database called `elsa.db` in folder `c:\data`. You will have to create this folder manually if it doesn't exist.
\ No newline at end of file
+SET EF_CONNECTIONSTRING="Server=localhost;Database=Elsa;User=sa;Password=Secret_password123!;"
+dotnet ef database update --context SqlServerContext
+```
\ No newline at end of file
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowDefinitionStore.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowDefinitionStore.cs
index cb5a4853f..19a938d03 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowDefinitionStore.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowDefinitionStore.cs
@@ -4,6 +4,7 @@ using System.Threading;
using System.Threading.Tasks;
using AutoMapper;
using Elsa.Models;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Elsa.Persistence.EntityFrameworkCore.Entities;
using Elsa.Persistence.EntityFrameworkCore.Extensions;
using Microsoft.EntityFrameworkCore;
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowInstanceStore.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowInstanceStore.cs
index 9dc7d6b58..f9855935f 100644
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowInstanceStore.cs
+++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Services/EntityFrameworkCoreWorkflowInstanceStore.cs
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using AutoMapper;
using Elsa.Extensions;
using Elsa.Models;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Elsa.Persistence.EntityFrameworkCore.Entities;
using Microsoft.EntityFrameworkCore;
diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/sqlserver-create.sql b/src/persistence/Elsa.Persistence.EntityFrameworkCore/sqlserver-create.sql
deleted file mode 100644
index 69728328e..000000000
--- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/sqlserver-create.sql
+++ /dev/null
@@ -1,55 +0,0 @@
-IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
-BEGIN
- CREATE TABLE [__EFMigrationsHistory] (
- [MigrationId] nvarchar(150) NOT NULL,
- [ProductVersion] nvarchar(32) NOT NULL,
- CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
- );
-END;
-
-GO
-
-CREATE TABLE [WorkflowDefinitionVersions] (
- [Id] nvarchar(450) NOT NULL,
- [DefinitionId] nvarchar(max) NULL,
- [Version] int NOT NULL,
- [Name] nvarchar(max) NULL,
- [Description] nvarchar(max) NULL,
- [Activities] nvarchar(max) NULL,
- [Connections] nvarchar(max) NULL,
- [Variables] nvarchar(max) NULL,
- [IsSingleton] bit NOT NULL,
- [IsDisabled] bit NOT NULL,
- [IsPublished] bit NOT NULL,
- [IsLatest] bit NOT NULL,
- CONSTRAINT [PK_WorkflowDefinitionVersions] PRIMARY KEY ([Id])
-);
-
-GO
-
-CREATE TABLE [WorkflowInstances] (
- [Id] nvarchar(450) NOT NULL,
- [DefinitionId] nvarchar(max) NULL,
- [Version] int NOT NULL,
- [Status] nvarchar(max) NOT NULL,
- [CorrelationId] nvarchar(max) NULL,
- [CreatedAt] datetime2 NOT NULL,
- [StartedAt] datetime2 NULL,
- [FinishedAt] datetime2 NULL,
- [FaultedAt] datetime2 NULL,
- [AbortedAt] datetime2 NULL,
- [Activities] nvarchar(max) NULL,
- [Scopes] nvarchar(max) NULL,
- [Input] nvarchar(max) NULL,
- [BlockingActivities] nvarchar(max) NULL,
- [ExecutionLog] nvarchar(max) NULL,
- [Fault] nvarchar(max) NULL,
- CONSTRAINT [PK_WorkflowInstances] PRIMARY KEY ([Id])
-);
-
-GO
-
-INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
-VALUES (N'20190929143746_InitialCreate', N'2.2.6-servicing-10079');
-
-GO
diff --git a/src/samples/Sample14/ElsaContextFactory.cs b/src/samples/Sample14/ElsaContextFactory.cs
index b8fb135ce..1741dec59 100644
--- a/src/samples/Sample14/ElsaContextFactory.cs
+++ b/src/samples/Sample14/ElsaContextFactory.cs
@@ -1,4 +1,5 @@
using Elsa.Persistence.EntityFrameworkCore;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
diff --git a/src/samples/Sample14/Migrations/20191021193326_InitialCreate.Designer.cs b/src/samples/Sample14/Migrations/20191021193326_InitialCreate.Designer.cs
index d1092c998..960401c4b 100644
--- a/src/samples/Sample14/Migrations/20191021193326_InitialCreate.Designer.cs
+++ b/src/samples/Sample14/Migrations/20191021193326_InitialCreate.Designer.cs
@@ -1,6 +1,7 @@
//
using System;
using Elsa.Persistence.EntityFrameworkCore;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/src/samples/Sample14/Migrations/ElsaContextModelSnapshot.cs b/src/samples/Sample14/Migrations/ElsaContextModelSnapshot.cs
index b3084869a..6e53554b6 100644
--- a/src/samples/Sample14/Migrations/ElsaContextModelSnapshot.cs
+++ b/src/samples/Sample14/Migrations/ElsaContextModelSnapshot.cs
@@ -1,6 +1,7 @@
//
using System;
using Elsa.Persistence.EntityFrameworkCore;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
diff --git a/src/samples/Sample14/Program.cs b/src/samples/Sample14/Program.cs
index 291de3f84..7dc2d6e8c 100644
--- a/src/samples/Sample14/Program.cs
+++ b/src/samples/Sample14/Program.cs
@@ -5,6 +5,7 @@ using Elsa.Extensions;
using Elsa.Models;
using Elsa.Persistence;
using Elsa.Persistence.EntityFrameworkCore;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
using Elsa.Persistence.EntityFrameworkCore.Extensions;
using Elsa.Runtime;
using Elsa.Services;
diff --git a/src/samples/Sample22/HelloWorldWorkflow.cs b/src/samples/Sample22/HelloWorldWorkflow.cs
new file mode 100644
index 000000000..81b15471a
--- /dev/null
+++ b/src/samples/Sample22/HelloWorldWorkflow.cs
@@ -0,0 +1,16 @@
+using Elsa.Activities.Console.Activities;
+using Elsa.Expressions;
+using Elsa.Services;
+using Elsa.Services.Models;
+
+namespace Sample22
+{
+ public class HelloWorldWorkflow : IWorkflow
+ {
+ public void Build(IWorkflowBuilder builder)
+ {
+ builder
+ .StartWith(activity => activity.TextExpression = new LiteralExpression("Hello World!"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/samples/Sample22/Program.cs b/src/samples/Sample22/Program.cs
new file mode 100644
index 000000000..21dbdbb39
--- /dev/null
+++ b/src/samples/Sample22/Program.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Threading.Tasks;
+using Elsa.Activities.Console.Extensions;
+using Elsa.Extensions;
+using Elsa.Models;
+using Elsa.Persistence;
+using Elsa.Persistence.EntityFrameworkCore;
+using Elsa.Persistence.EntityFrameworkCore.DbContexts;
+using Elsa.Persistence.EntityFrameworkCore.Extensions;
+using Elsa.Runtime;
+using Elsa.Services;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Sample22
+{
+ ///
+ /// A simple demonstration of using Entity Framework Core persistence providers with SQL Server.
+ /// To run the EF migration, run the command: `dotnet ef database update` within the context of the "Elsa.Persistence.EntityFrameworkCore" project root.
+ ///
+ public class Program
+ {
+ public static async Task Main(string[] args)
+ {
+ var services = BuildServices();
+
+ // Create a workflow definition.
+ var registry = services.GetService();
+ var workflowDefinition = await registry.GetWorkflowDefinitionAsync();
+
+ // Mark this definition as the "latest" version.
+ workflowDefinition.IsLatest = true;
+ workflowDefinition.Version = 1;
+
+ using var scope = services.CreateScope();
+ var dbContext = scope.ServiceProvider.GetRequiredService();
+
+ // Ensure DB exists.
+ await dbContext.Database.EnsureCreatedAsync();
+
+ // Persist the workflow definition.
+ var definitionStore = scope.ServiceProvider.GetRequiredService();
+ await definitionStore.SaveAsync(workflowDefinition);
+
+ // Flush to DB.
+ await dbContext.SaveChangesAsync();
+
+ // Load the workflow definition.
+ workflowDefinition = await definitionStore.GetByIdAsync(
+ workflowDefinition.DefinitionId,
+ VersionOptions.Latest);
+
+ // Execute the workflow.
+ var invoker = scope.ServiceProvider.GetRequiredService();
+ var executionContext = await invoker.StartAsync(workflowDefinition);
+
+ // Persist the workflow instance.
+ var instanceStore = scope.ServiceProvider.GetRequiredService();
+ var workflowInstance = executionContext.Workflow.ToInstance();
+ await instanceStore.SaveAsync(workflowInstance);
+
+ // Flush to DB.
+ await dbContext.SaveChangesAsync();
+ }
+
+ private static IServiceProvider BuildServices()
+ {
+ return new ServiceCollection()
+ .AddElsa(
+ x => x.AddEntityFrameworkStores(
+ options => options
+ .UseSqlServer(@"Server=localhost;Database=Elsa;User=sa;Password=Secret_password123!;")))
+ .AddConsoleActivities()
+ .AddWorkflow()
+ .BuildServiceProvider();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/samples/Sample22/Sample22.csproj b/src/samples/Sample22/Sample22.csproj
new file mode 100644
index 000000000..b78610a0c
--- /dev/null
+++ b/src/samples/Sample22/Sample22.csproj
@@ -0,0 +1,19 @@
+
+
+
+ Exe
+ netcoreapp3.0
+ latest
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/samples/Sample22/docker-compose.yaml b/src/samples/Sample22/docker-compose.yaml
new file mode 100644
index 000000000..550bbf2a5
--- /dev/null
+++ b/src/samples/Sample22/docker-compose.yaml
@@ -0,0 +1,10 @@
+version: '3.7'
+
+services:
+ db:
+ image: "mcr.microsoft.com/mssql/server:2017-latest"
+ ports:
+ - "1433:1433"
+ environment:
+ SA_PASSWORD: "Secret_password123!"
+ ACCEPT_EULA: "Y"
\ No newline at end of file