Skip to content

feat: Add .NET 8.0 support for Oracle persistence provider and improve test infrastructure #1369

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,19 @@ jobs:
run: dotnet build --no-restore
- name: Elasticsearch Tests
run: dotnet test test/WorkflowCore.Tests.Elasticsearch --no-build --verbosity normal -p:ParallelizeTestCollections=false
Oracle-Tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: |
6.0.x
8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Oracle Tests
run: dotnet test test/WorkflowCore.Tests.Oracle --no-build --verbosity normal -p:ParallelizeTestCollections=false
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ There are several persistence providers available as separate Nuget packages.
* [Sqlite](src/providers/WorkflowCore.Persistence.Sqlite)
* [MySQL](src/providers/WorkflowCore.Persistence.MySQL)
* [Redis](src/providers/WorkflowCore.Providers.Redis)
* [Oracle](src/providers/WorkflowCore.Persistence.Oracle)

## Search

Expand Down
1 change: 1 addition & 0 deletions docs/persistence.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ There are several persistence providers available as separate Nuget packages.
* [Amazon DynamoDB](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Providers.AWS)
* [Cosmos DB](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Providers.Azure)
* [Redis](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Providers.Redis)
* [Oracle](https://github.com/danielgerlag/workflow-core/tree/master/src/providers/WorkflowCore.Persistence.Oracle)
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Linq;

using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Design;

namespace WorkflowCore.Persistence.Oracle
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System;
using System.Linq;

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

using Oracle.EntityFrameworkCore.Infrastructure;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Linq;

using Microsoft.EntityFrameworkCore.Infrastructure;

using Oracle.EntityFrameworkCore.Infrastructure;

Expand Down
12 changes: 12 additions & 0 deletions src/providers/WorkflowCore.Persistence.Oracle/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,15 @@ Use the .UseOracle extension method when building your service provider.
```C#
services.AddWorkflow(x => x.UseOracle(@"Server=127.0.0.1;Database=workflow;User=root;Password=password;", true, true));
```

You can also add specific database version compability if needed.
Copy link
Preview

Copilot AI Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The word 'compability' should be 'compatibility'.

Suggested change
You can also add specific database version compability if needed.
You can also add specific database version compatibility if needed.

Copilot uses AI. Check for mistakes.


```C#
services.AddWorkflow(x =>
{
x.UseOracle(connectionString, false, true, options =>
{
options.UseOracleSQLCompatibility(OracleSQLCompatibility.DatabaseVersion19);
});
});
```
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Linq;

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;

using Oracle.EntityFrameworkCore.Infrastructure;
Expand All @@ -14,10 +11,10 @@ namespace WorkflowCore.Persistence.Oracle
{
public static class ServiceCollectionExtensions
{
public static WorkflowOptions UseOracle(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, Action<OracleDbContextOptionsBuilder> mysqlOptionsAction = null)
public static WorkflowOptions UseOracle(this WorkflowOptions options, string connectionString, bool canCreateDB, bool canMigrateDB, Action<OracleDbContextOptionsBuilder> oracleOptionsAction = null)
{
options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new OracleContextFactory(connectionString, mysqlOptionsAction), canCreateDB, canMigrateDB));
options.Services.AddTransient<IWorkflowPurger>(sp => new WorkflowPurger(new OracleContextFactory(connectionString, mysqlOptionsAction)));
options.UsePersistence(sp => new EntityFrameworkPersistenceProvider(new OracleContextFactory(connectionString, oracleOptionsAction), canCreateDB, canMigrateDB));
options.Services.AddTransient<IWorkflowPurger>(sp => new WorkflowPurger(new OracleContextFactory(connectionString, oracleOptionsAction)));
return options;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,50 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<AssemblyTitle>Workflow Core Oracle Persistence Provider</AssemblyTitle>
<VersionPrefix>1.0.0</VersionPrefix>
<Authors>Christian Jundt</Authors>
<TargetFrameworks>net6.0</TargetFrameworks>
<AssemblyName>WorkflowCore.Persistence.Oracle</AssemblyName>
<PackageId>WorkflowCore.Persistence.Oracle</PackageId>
<PackageTags>workflow;.NET;Core;state machine;WorkflowCore;Oracle</PackageTags>
<PackageProjectUrl>https://github.com/danielgerlag/workflow-core</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/danielgerlag/workflow-core/blob/master/LICENSE.md</PackageLicenseUrl>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/danielgerlag/workflow-core.git</RepositoryUrl>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<Description>Provides support to persist workflows running on Workflow Core to a Oracle database.</Description>
</PropertyGroup>
<PropertyGroup>
<AssemblyTitle>Workflow Core Oracle Persistence Provider</AssemblyTitle>
<VersionPrefix>1.0.0</VersionPrefix>
<Authors>Christian Jundt</Authors>
<TargetFrameworks>net6.0;net8.0</TargetFrameworks>
<AssemblyName>WorkflowCore.Persistence.Oracle</AssemblyName>
<PackageId>WorkflowCore.Persistence.Oracle</PackageId>
<PackageTags>workflow;.NET;Core;state machine;WorkflowCore;Oracle</PackageTags>
<PackageProjectUrl>https://github.com/danielgerlag/workflow-core</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/danielgerlag/workflow-core/blob/master/LICENSE.md</PackageLicenseUrl>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/danielgerlag/workflow-core.git</RepositoryUrl>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<Description>Provides support to persist workflows running on Workflow Core to a Oracle database.</Description>
</PropertyGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.*">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.*">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Oracle.EntityFrameworkCore">
<Version>7.21.13</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.*">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.*">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Oracle.EntityFrameworkCore" Version="8.*" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\WorkflowCore\WorkflowCore.csproj" />
<ProjectReference Include="..\WorkflowCore.Persistence.EntityFramework\WorkflowCore.Persistence.EntityFramework.csproj" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.*">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.*">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Oracle.EntityFrameworkCore">
<Version>7.21.13</Version>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\WorkflowCore\WorkflowCore.csproj" />
<ProjectReference Include="..\WorkflowCore.Persistence.EntityFramework\WorkflowCore.Persistence.EntityFramework.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System;
using WorkflowCore.Interface;
using WorkflowCore.Interface;
using WorkflowCore.Persistence.EntityFramework.Services;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;
using WorkflowCore.UnitTests;
using Xunit;
using Xunit.Abstractions;
Expand All @@ -12,10 +10,10 @@ namespace WorkflowCore.Tests.Oracle
[Collection("Oracle collection")]
public class OraclePersistenceProviderFixture : BasePersistenceFixture
{
private readonly IPersistenceProvider _subject;
private readonly EntityFrameworkPersistenceProvider _subject;
protected override IPersistenceProvider Subject => _subject;

public OraclePersistenceProviderFixture(OracleDockerSetup dockerSetup, ITestOutputHelper output)
public OraclePersistenceProviderFixture(ITestOutputHelper output)
{
output.WriteLine($"Connecting on {OracleDockerSetup.ConnectionString}");
Copy link
Preview

Copilot AI Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The constructor parameter 'dockerSetup' of type 'OracleDockerSetup' was removed, but the class still inherits from a collection fixture that provides this dependency. The test fixture may fail to initialize properly without accessing the Docker setup.

Suggested change
{
{
// OracleDockerSetup is a static class providing the connection string.
// Ensure that OracleDockerSetup is properly initialized before using its static members.

Copilot uses AI. Check for mistakes.

_subject = new EntityFrameworkPersistenceProvider(new OracleContextFactory(OracleDockerSetup.ConnectionString), true, true);
Expand Down
28 changes: 18 additions & 10 deletions test/WorkflowCore.Tests.Oracle/OracleSetup.cs
Original file line number Diff line number Diff line change
@@ -1,26 +1,34 @@
using System;
using System.Threading.Tasks;

using System.Threading.Tasks;
using Testcontainers.Oracle;
using Xunit;

namespace WorkflowCore.Tests.Oracle
{
public class OracleDockerSetup : IAsyncLifetime
{
public static string ConnectionString => "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORCLPDB1) ) );User ID=TEST_WF;Password=test;";
private readonly OracleContainer _oracleContainer;

public async Task InitializeAsync()
public static string ConnectionString { get; private set; }

public OracleDockerSetup()
{
_oracleContainer = new OracleBuilder()
.WithImage("gvenzl/oracle-free:latest")
.WithUsername("TEST_WF")
.WithPassword("test")
.Build();
}

public Task DisposeAsync()
public async Task InitializeAsync()
{
return Task.CompletedTask;
await _oracleContainer.StartAsync();
// Build connection string manually since TestContainers might not provide Oracle-specific format
ConnectionString = $"Data Source=localhost:{_oracleContainer.GetMappedPublicPort(1521)}/FREEPDB1;User Id=TEST_WF;Password=test;";
}

public async Task DisposeAsync() => await _oracleContainer.DisposeAsync();
}

[CollectionDefinition("Oracle collection")]
public class OracleCollection : ICollectionFixture<OracleDockerSetup>
{
}
public class OracleCollection : ICollectionFixture<OracleDockerSetup> { }
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleActivityScenario : ActivityScenario
{
{
protected override void ConfigureServices(IServiceCollection services)
{
services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleBasicScenario : BasicScenario
{
{
protected override void ConfigureServices(IServiceCollection services)
{
services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleDataScenario : DataIOScenario
{
{
protected override void ConfigureServices(IServiceCollection services)
{
services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleDelayScenario : DelayScenario
{
{
protected override void ConfigureServices(IServiceCollection services)
{
services.AddWorkflow(cfg =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleEventScenario : EventScenario
{
{
protected override void ConfigureServices(IServiceCollection services)
{
services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleForeachScenario : ForeachScenario
{
{
protected override void ConfigureServices(IServiceCollection services)
{
services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.IntegrationTests.Scenarios;
using WorkflowCore.Persistence.Oracle;
using WorkflowCore.Tests.Oracle;

using Xunit;

namespace WorkflowCore.Tests.Oracle.Scenarios
{
[Collection("Oracle collection")]
public class OracleForkScenario : ForkScenario
{
{
protected override void Configure(IServiceCollection services)
{
services.AddWorkflow(x => x.UseOracle(OracleDockerSetup.ConnectionString, true, true));
Expand Down
Loading
Loading