diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 5340c7c54..58f37a11b 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -24,6 +24,19 @@ - "3306:3306" volumes: - mysql_data2:/var/lib/mysql + + oracle: + image: container-registry.oracle.com/database/free:latest + container_name: oracle + environment: + ORACLE_PDB: ORCLPDB1 + ORACLE_PWD: elsa + ports: + - "1521:1521" + - "5500:5500" + volumes: + - oracle-data-free:/opt/oracle/oradata + shm_size: '1g' mongodb: image: mongo:latest @@ -84,7 +97,6 @@ - ASPNETCORE_URLS=http://+:80 - Logging__LogLevel__Default=Information - elsa-server: build: context: ../. @@ -116,6 +128,7 @@ volumes: postgres-data: + oracle-data-free: mysql_data2: cockroachdb-data: mongodb_data: diff --git a/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj b/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj index badb50298..0c3c5f082 100644 --- a/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj +++ b/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj @@ -9,6 +9,7 @@ + diff --git a/src/apps/Elsa.Server.Web/Enums/SqlDatabaseProvider.cs b/src/apps/Elsa.Server.Web/Enums/SqlDatabaseProvider.cs index cc2988042..651163385 100644 --- a/src/apps/Elsa.Server.Web/Enums/SqlDatabaseProvider.cs +++ b/src/apps/Elsa.Server.Web/Enums/SqlDatabaseProvider.cs @@ -6,5 +6,6 @@ public enum SqlDatabaseProvider Sqlite, MySql, PostgreSql, + Oracle, CockroachDb } \ No newline at end of file diff --git a/src/apps/Elsa.Server.Web/Program.cs b/src/apps/Elsa.Server.Web/Program.cs index 199ff6cce..0e9985ad8 100644 --- a/src/apps/Elsa.Server.Web/Program.cs +++ b/src/apps/Elsa.Server.Web/Program.cs @@ -99,6 +99,7 @@ var identityTokenSection = identitySection.GetSection("Tokens"); var sqliteConnectionString = configuration.GetConnectionString("Sqlite")!; var sqlServerConnectionString = configuration.GetConnectionString("SqlServer")!; var postgresConnectionString = configuration.GetConnectionString("PostgreSql")!; +var oracleConnectionString = configuration.GetConnectionString("Oracle")!; var mySqlConnectionString = configuration.GetConnectionString("MySql")!; var cockroachDbConnectionString = configuration.GetConnectionString("CockroachDb")!; var mongoDbConnectionString = configuration.GetConnectionString("MongoDb")!; @@ -195,6 +196,8 @@ services #endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString!); + else if (sqlDatabaseProvider == SqlDatabaseProvider.Oracle) + ef.UseOracle(oracleConnectionString); else ef.UseSqlite(sp => sp.GetSqliteConnectionString()); @@ -231,6 +234,8 @@ services #endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString!); + else if (sqlDatabaseProvider == SqlDatabaseProvider.Oracle) + ef.UseOracle(oracleConnectionString); else ef.UseSqlite(sp => sp.GetSqliteConnectionString()); @@ -276,7 +281,9 @@ services ef.UseMySql(mySqlConnectionString); #endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) - ef.UsePostgreSql(cockroachDbConnectionString!); + ef.UsePostgreSql(cockroachDbConnectionString); + else if (sqlDatabaseProvider == SqlDatabaseProvider.Oracle) + ef.UseOracle(oracleConnectionString); else ef.UseSqlite(sp => sp.GetSqliteConnectionString()); @@ -411,7 +418,9 @@ services ef.UseMySql(mySqlConnectionString); #endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) - ef.UsePostgreSql(cockroachDbConnectionString!); + ef.UsePostgreSql(cockroachDbConnectionString); + else if (sqlDatabaseProvider == SqlDatabaseProvider.Oracle) + ef.UseOracle(oracleConnectionString); else ef.UseSqlite(sp => sp.GetSqliteConnectionString()); @@ -614,6 +623,7 @@ services if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) ef.UseSqlite(sqliteConnectionString); if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) ef.UseSqlServer(sqlServerConnectionString); if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgresConnectionString); + if (sqlDatabaseProvider == SqlDatabaseProvider.Oracle) ef.UseOracle(oracleConnectionString); #if !NET9_0 if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); diff --git a/src/apps/Elsa.Server.Web/appsettings.json b/src/apps/Elsa.Server.Web/appsettings.json index 221cdcf22..ae6820a3f 100644 --- a/src/apps/Elsa.Server.Web/appsettings.json +++ b/src/apps/Elsa.Server.Web/appsettings.json @@ -13,6 +13,7 @@ "Sqlite": "Data Source=App_Data/elsa.sqlite.db;Cache=Shared;", "MySql": "Server=localhost;Database=elsa;Uid=admin;Pwd=password;", "PostgreSql": "Server=localhost;Username=elsa;Database=elsa;Port=5432;Password=elsa;SSLMode=Prefer;MaxPoolSize=2000;Timeout=60", + "Oracle": "User Id=SYSTEM;Password=elsa;Data Source=oracle:1521/ORCLPDB1", "CockroachDb": "Host=localhost;Port=26257;Database=elsa;SslMode=Disable;Username=root;IncludeErrorDetail=true", "MongoDb": "mongodb://localhost:27017/elsa-workflows", "AzureServiceBus": "", diff --git a/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore/SetupForOracle.cs b/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore/SetupForOracle.cs index 2f5444792..1dec01e7d 100644 --- a/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore/SetupForOracle.cs +++ b/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore/SetupForOracle.cs @@ -19,7 +19,7 @@ public class SetupForOracle : IEntityModelCreatingHandler // In order to use data more than 2000 char we have to use NCLOB. // In Oracle, we have to explicitly say the column is NCLOB otherwise it would be considered nvarchar(2000). - modelBuilder.Entity().Property("SerializedSettings").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedAgentConfig").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedSettings").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedAgentConfig").HasColumnType("NCLOB"); } } \ No newline at end of file diff --git a/src/modules/Elsa.EntityFrameworkCore.Common/ElsaDbContextBase.cs b/src/modules/Elsa.EntityFrameworkCore.Common/ElsaDbContextBase.cs index eef02af6e..2a677bb6f 100644 --- a/src/modules/Elsa.EntityFrameworkCore.Common/ElsaDbContextBase.cs +++ b/src/modules/Elsa.EntityFrameworkCore.Common/ElsaDbContextBase.cs @@ -69,7 +69,7 @@ public abstract class ElsaDbContextBase : DbContext, IElsaDbContextSchema var entityTypeHandlers = ServiceProvider.GetServices().ToList(); - foreach (var entityType in modelBuilder.Model.GetEntityTypes()) + foreach (var entityType in modelBuilder.Model.GetEntityTypes().ToList()) { foreach (var handler in entityTypeHandlers) { diff --git a/src/modules/Elsa.EntityFrameworkCore/Modules/Alterations/SetupForOracle.cs b/src/modules/Elsa.EntityFrameworkCore/Modules/Alterations/SetupForOracle.cs index a9b7703bc..8c3b5b2a3 100644 --- a/src/modules/Elsa.EntityFrameworkCore/Modules/Alterations/SetupForOracle.cs +++ b/src/modules/Elsa.EntityFrameworkCore/Modules/Alterations/SetupForOracle.cs @@ -18,8 +18,11 @@ public class SetupForOracle : IEntityModelCreatingHandler // In order to use data more than 2000 char we have to use NCLOB. // In Oracle, we have to explicitly say the column is NCLOB otherwise it would be considered nvarchar(2000). - modelBuilder.Entity().Property("SerializedAlterations").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedWorkflowInstanceIds").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedLog").HasColumnType("NCLOB"); + modelBuilder.Entity().Ignore(x => x.Alterations); + modelBuilder.Entity().Ignore(x => x.WorkflowInstanceFilter); + modelBuilder.Entity().Property("SerializedAlterations").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedWorkflowInstanceFilter").HasColumnType("NCLOB"); + modelBuilder.Entity().Ignore(x => x.Log); + modelBuilder.Entity().Property("SerializedLog").HasColumnType("NCLOB"); } } \ No newline at end of file diff --git a/src/modules/Elsa.EntityFrameworkCore/Modules/Management/SetupForOracle.cs b/src/modules/Elsa.EntityFrameworkCore/Modules/Management/SetupForOracle.cs index c14e6f4e1..da338d428 100644 --- a/src/modules/Elsa.EntityFrameworkCore/Modules/Management/SetupForOracle.cs +++ b/src/modules/Elsa.EntityFrameworkCore/Modules/Management/SetupForOracle.cs @@ -18,8 +18,8 @@ public class SetupForOracle : IEntityModelCreatingHandler // In order to use data more than 2000 char we have to use NCLOB. // In Oracle, we have to explicitly say the column is NCLOB otherwise it would be considered nvarchar(2000). - modelBuilder.Entity().Property("Data").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("StringData").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("Data").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("Data").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("StringData").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("Data").HasColumnType("NCLOB"); } } \ No newline at end of file diff --git a/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/SetupForOracle.cs b/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/SetupForOracle.cs index 2a4351a38..9820dfbab 100644 --- a/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/SetupForOracle.cs +++ b/src/modules/Elsa.EntityFrameworkCore/Modules/Runtime/SetupForOracle.cs @@ -19,22 +19,37 @@ public class SetupForOracle : IEntityModelCreatingHandler // To use data more than 2000 char we have to use NCLOB. // In Oracle, we have to explicitly say the column is NCLOB otherwise it would be considered nvarchar(2000). - modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedActivityState").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); + modelBuilder.Entity().Ignore(x => x.ActivityState); + modelBuilder.Entity().Ignore(x => x.Payload); + modelBuilder.Entity().Property("SerializedActivityState").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedActivityState").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedException").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedOutputs").HasColumnType("NCLOB"); + modelBuilder.Entity().Ignore(x => x.ActivityState); + modelBuilder.Entity().Ignore(x => x.Exception); + modelBuilder.Entity().Ignore(x => x.Payload); + modelBuilder.Entity().Ignore(x => x.Outputs); + modelBuilder.Entity().Ignore(x => x.Properties); + modelBuilder.Entity().Property("SerializedActivityState").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedException").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedOutputs").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedProperties").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedMetadata").HasColumnType("NCLOB"); + modelBuilder.Entity().Ignore(x => x.Payload); + modelBuilder.Entity().Ignore(x => x.Metadata); + modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedMetadata").HasColumnType("NCLOB"); + + modelBuilder.Entity().Ignore(x => x.Payload); + modelBuilder.Entity().Property("SerializedPayload").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedInput").HasColumnType("NCLOB"); - modelBuilder.Entity().Property("SerializedBookmarkPayload").HasColumnType("NCLOB"); - - modelBuilder.Entity().Property("SerializedValue").HasColumnType("NCLOB"); + modelBuilder.Entity().Ignore(x => x.Input); + modelBuilder.Entity().Ignore(x => x.BookmarkPayload); + modelBuilder.Entity().Property("SerializedInput").HasColumnType("NCLOB"); + modelBuilder.Entity().Property("SerializedBookmarkPayload").HasColumnType("NCLOB"); + + modelBuilder.Entity().Property("SerializedValue").HasColumnType("NCLOB"); } } \ No newline at end of file