From 98fe6d21d7f91e138aa1fc465f0dc12a287946e5 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 26 Nov 2019 22:54:06 +0100 Subject: [PATCH] Add SQL Server example --- Samples.sln | 7 + Samples.sln.DotSettings | 3 +- .../{ => DbContexts}/ElsaContext.cs | 284 +++++++++--------- .../DbContexts/SqlServerContext.cs | 11 + .../DbContexts/SqlServerContextFactory.cs | 26 ++ .../DbContexts/SqliteContext.cs | 11 + .../DbContexts/SqliteContextFactory.cs | 26 ++ .../DesignTimeElsaContextFactory.cs | 37 --- .../EFCoreServiceCollectionExtensions.cs | 1 + .../20191126215035_InitialCreate.Designer.cs | 261 ++++++++++++++++ .../SqlServer/20191126215035_InitialCreate.cs | 190 ++++++++++++ .../SqlServerContextModelSnapshot.cs | 259 ++++++++++++++++ .../20191126211902_InitialCreate.Designer.cs} | 13 +- .../20191126211902_InitialCreate.cs} | 11 +- .../SqliteContextModelSnapshot.cs} | 13 +- .../README.md | 25 +- ...ityFrameworkCoreWorkflowDefinitionStore.cs | 1 + ...ntityFrameworkCoreWorkflowInstanceStore.cs | 1 + .../sqlserver-create.sql | 55 ---- src/samples/Sample14/ElsaContextFactory.cs | 1 + .../20191021193326_InitialCreate.Designer.cs | 1 + .../Migrations/ElsaContextModelSnapshot.cs | 1 + src/samples/Sample14/Program.cs | 1 + src/samples/Sample22/HelloWorldWorkflow.cs | 16 + src/samples/Sample22/Program.cs | 78 +++++ src/samples/Sample22/Sample22.csproj | 19 ++ src/samples/Sample22/docker-compose.yaml | 10 + 27 files changed, 1110 insertions(+), 252 deletions(-) rename src/persistence/Elsa.Persistence.EntityFrameworkCore/{ => DbContexts}/ElsaContext.cs (96%) create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContext.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqlServerContextFactory.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContext.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/DbContexts/SqliteContextFactory.cs delete mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/DesignTimeElsaContextFactory.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.Designer.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/20191126215035_InitialCreate.cs create mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/SqlServer/SqlServerContextModelSnapshot.cs rename src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/{20191116105145_InitialCreate.Designer.cs => Sqlite/20191126211902_InitialCreate.Designer.cs} (95%) rename src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/{20191116105145_InitialCreate.cs => Sqlite/20191126211902_InitialCreate.cs} (94%) rename src/persistence/Elsa.Persistence.EntityFrameworkCore/Migrations/{ElsaContextModelSnapshot.cs => Sqlite/SqliteContextModelSnapshot.cs} (94%) delete mode 100644 src/persistence/Elsa.Persistence.EntityFrameworkCore/sqlserver-create.sql create mode 100644 src/samples/Sample22/HelloWorldWorkflow.cs create mode 100644 src/samples/Sample22/Program.cs create mode 100644 src/samples/Sample22/Sample22.csproj create mode 100644 src/samples/Sample22/docker-compose.yaml 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