{"record":{"id":"02d02d1663a8d452","repo":"elsa-workflows/elsa-core","slug":"adapter-settings-migrations-must-define-an-adapter-type-and","errorCode":null,"errorMessage":"Adapter settings migrations must define an adapter type and a positive source version.","messagePattern":"Adapter settings migrations must define an adapter type and a positive source version\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/modules/Elsa.ExternalAuthentication/Services/AdapterSettingsMigrationService.cs","lineNumber":60,"sourceCode":"                throw new InvalidOperationException($\"Adapter '{adapterType}' has an invalid settings migration from version {version} to {migration.ToVersion}.\");\n            if (++stepCount > 64)\n                throw new InvalidOperationException($\"Adapter '{adapterType}' settings migration contains a cycle.\");\n\n            migrated = (await migration.MigrateAsync(migrated, cancellationToken)).Clone();\n            version = migration.ToVersion;\n        }\n\n        return new(version, migrated, true);\n    }\n\n    private static IReadOnlyDictionary<(string AdapterType, int FromVersion), IAdapterSettingsMigration> BuildMigrationIndex(\n        IEnumerable<IAdapterSettingsMigration> migrations)\n    {\n        var result = new Dictionary<(string AdapterType, int FromVersion), IAdapterSettingsMigration>();\n        foreach (var migration in migrations)\n        {\n            if (string.IsNullOrWhiteSpace(migration.AdapterType) || migration.FromVersion <= 0)\n                throw new InvalidOperationException(\"Adapter settings migrations must define an adapter type and a positive source version.\");\n            if (!result.TryAdd((migration.AdapterType, migration.FromVersion), migration))\n                throw new InvalidOperationException($\"Adapter '{migration.AdapterType}' registers more than one migration from version {migration.FromVersion}.\");\n        }\n        return result;\n    }\n}\n","sourceCodeStart":42,"sourceCodeEnd":67,"githubUrl":"https://github.com/elsa-workflows/elsa-core/blob/fe9217bdfa0e27f0e09e45006eb6898f616e513d/src/modules/Elsa.ExternalAuthentication/Services/AdapterSettingsMigrationService.cs#L42-L67","documentation":"BuildMigrationIndex validates every registered IAdapterSettingsMigration at service construction: each must declare a non-empty AdapterType and a FromVersion of at least 1. A migration with a blank type or FromVersion <= 0 cannot be indexed and fails fast with this error.","triggerScenarios":"Registering an IAdapterSettingsMigration whose AdapterType is null/empty/whitespace or whose FromVersion is 0 or negative — typically a default-constructed or misconfigured migration class.","commonSituations":"New migration implementations forgetting to set AdapterType; version constants defaulting to 0; DI-registered migrations where config that supplies the type/version failed to bind.","solutions":["Set AdapterType and FromVersion in the migration's constructor to valid values (type non-empty, FromVersion >= 1).","Fix the configuration/DI wiring that produces empty values.","Add unit tests instantiating every migration and asserting valid AdapterType/FromVersion."],"exampleFix":"// before\npublic MyAdapterMigration() { } // AdapterType null, FromVersion 0\n// after\npublic MyAdapterMigration() { AdapterType = \"my-adapter\"; FromVersion = 1; ToVersion = 2; }","handlingStrategy":"validation","validationCode":"foreach (var m in migrations)\n    if (string.IsNullOrWhiteSpace(m.AdapterType) || m.FromVersion <= 0)\n        throw new InvalidOperationException($\"Invalid migration registration: type='{m.AdapterType}', from={m.FromVersion}\");","typeGuard":null,"tryCatchPattern":"try { app = builder.Build(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"must define an adapter type\"))\n{ /* fail startup with a clear message naming the bad migration */ }","preventionTips":["Require constructor arguments for AdapterType/FromVersion — no parameterless defaults","Instantiation tests for all IAdapterSettingsMigration implementations","Validate migration registrations at startup before serving traffic"],"tags":["configuration","migration","validation"],"backgroundTag":"missing-required-argument","analyzedSha":"fe9217bdfa0e27f0e09e45006eb6898f616e513d","analyzedAt":"2026-09-13T20:32:34.702Z","contentChangedAt":"2026-09-13T20:32:34.702Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}