{"record":{"id":"d98f0c3e9e27954d","repo":"elsa-workflows/elsa-core","slug":"provider-providername-is-not-supported","errorCode":null,"errorMessage":"Provider '{providerName}' is not supported.","messagePattern":"Provider '(.+?)' is not supported\\.","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"src/modules/Elsa.Persistence.EFCore.Common/Extensions/BulkUpsertExtensions.cs","lineNumber":71,"sourceCode":"        CancellationToken cancellationToken = default)\n        where TDbContext : DbContext\n        where TEntity : class, new()\n    {\n        if (entities.Count == 0)\n            return;\n\n        // Identify the current provider (e.g., \"Microsoft.EntityFrameworkCore.SqlServer\")\n        var providerName = dbContext.Database.ProviderName?.ToLowerInvariant() ?? string.Empty;\n\n        // Determine the method for generating SQL based on the provider\n        Func<DbContext, IList<TEntity>, Expression<Func<TEntity, string>>, (string, object[])> generateSql = providerName switch\n        {\n            var pn when pn.Contains(\"sqlserver\") => GenerateSqlServerUpsert,\n            var pn when pn.Contains(\"sqlite\") => GenerateSqliteUpsert,\n            var pn when pn.Contains(\"postgres\") => GeneratePostgresUpsert,\n            var pn when pn.Contains(\"mysql\") => GenerateMySqlUpsert,\n            var pn when pn.Contains(\"oracle\") => GenerateOracleUpsert,\n            _ => throw new NotSupportedException($\"Provider '{providerName}' is not supported.\")\n        };\n\n        // Loop through batched entities\n        foreach (var batch in entities.Chunk(batchSize))\n        {\n            // Generate SQL and parameters\n            var (sql, parameters) = generateSql(dbContext, batch, keySelector);\n\n            await dbContext.Database.ExecuteSqlRawAsync(sql, parameters, cancellationToken);\n        }\n    }\n\n    private static (string, object[]) GenerateSqlServerUpsert<TEntity>(\n        DbContext dbContext,\n        IList<TEntity> entities,\n        Expression<Func<TEntity, string>> keySelector)\n        where TEntity : class\n    {","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/elsa-workflows/elsa-core/blob/fe9217bdfa0e27f0e09e45006eb6898f616e513d/src/modules/Elsa.Persistence.EFCore.Common/Extensions/BulkUpsertExtensions.cs#L53-L89","documentation":"Elsa's EF Core bulk upsert helper builds provider-specific raw SQL for batched upserts. It only has generators for SQL Server, SQLite, PostgreSQL, MySQL/MariaDB, and Oracle; any other or unrecognized provider name hits the fallback arm of the switch expression and throws NotSupportedException. The error means you configured a DbContext provider (e.g. InMemory, Sqlite with a different connection string casing, or a custom provider) that bulk-upsert does not implement.","triggerScenarios":"Calling BulkUpsertAsync on a store whose providerName (derived from the EF Core relational provider) does not contain any of the substrings 'sqlserver', 'sqlite', 'postgres', 'mysql', or 'oracle' — e.g. using the EF Core InMemory provider or an unsupported third-party provider.","commonSituations":"Running workflows/tests against the EFCore InMemory database provider; using a forked or renamed provider assembly whose name doesn't match; a typo in a custom provider name; upgrading Elsa and switching persistence providers to one not yet supported by bulk upsert.","solutions":["Switch the persistence feature to a supported relational provider: SqlServer, Sqlite, PostgreSql, MySql, or Oracle EF Core packages.","If you're using the InMemory provider for testing, disable bulk upsert paths or use the standard SaveChanges-based persistence instead of BulkUpsertAsync.","Add a custom generator to the switch for your provider (fork or PR upstream) if you must keep that provider.","Verify the provider name by checking the configured UseXxx call on the DbContext; substring matching is case-sensitive on the lowercase provider names listed."],"exampleFix":"// before (InMemory in tests)\noptions.UseInMemoryDatabase(\"elsa\");\n// after\noptions.UseSqlite(connectionString);","handlingStrategy":"try-catch","validationCode":"var providerName = dbContext.Database.ProviderName ?? \"\";\nstring[] supported = { \"sqlserver\", \"sqlite\", \"postgres\", \"mysql\", \"oracle\" };\nbool bulkUpsertSupported = supported.Any(p => providerName.Contains(p));\nif (!bulkUpsertSupported) throw new InvalidOperationException($\"{providerName} does not support bulk upsert\");","typeGuard":"bool SupportsBulkUpsert(string? providerName) =>\n    providerName is not null &&\n    (providerName.Contains(\"sqlserver\") || providerName.Contains(\"sqlite\") ||\n     providerName.Contains(\"postgres\") || providerName.Contains(\"mysql\") ||\n     providerName.Contains(\"oracle\"));","tryCatchPattern":"try\n{\n    await store.BulkUpsertAsync(entities);\n}\ncatch (NotSupportedException ex)\n{\n    // fall back to per-entity SaveChanges persistence\n    logger.LogWarning(ex, \"Bulk upsert unsupported for this provider; using fallback\");\n    await SaveIndividuallyAsync(entities);\n}","preventionTips":["Pin test/prod environments to the same supported relational provider.","Assert Database.ProviderName in a startup health check before enabling bulk-upsert code paths.","Keep an InMemory-safe fallback persistence path for unit tests."],"tags":["efcore","persistence","unsupported-provider"],"backgroundTag":"unsupported-operation","analyzedSha":"fe9217bdfa0e27f0e09e45006eb6898f616e513d","analyzedAt":"2026-09-13T20:32:34.702Z","contentChangedAt":"2026-09-13T20:32:34.702Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}