{"record":{"id":"51fe3eb652b39d32","repo":"dotnet/orleans","slug":"invalid-nameof-adonetstreamoptions-values-for-a","errorCode":null,"errorMessage":"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.Invariant)} is required.","messagePattern":"Invalid (.+?) values for ADO\\.NET Streaming Provider '(.+?)': (.+?) is required\\.","errorType":"validation","errorClass":"OrleansConfigurationException","httpStatus":null,"severity":"error","filePath":"src/AdoNet/Orleans.Streaming.AdoNet/AdoNetStreamOptionsValidator.cs","lineNumber":15,"sourceCode":"using static System.String;\n\nnamespace Orleans.Configuration;\n\n/// <summary>\n/// Validates <see cref=\"AdoNetStreamOptions\"/> configuration.\n/// </summary>\npublic class AdoNetStreamOptionsValidator(AdoNetStreamOptions options, string name) : IConfigurationValidator\n{\n    /// <inheritdoc />\n    public void ValidateConfiguration()\n    {\n        if (IsNullOrWhiteSpace(options.Invariant))\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.Invariant)} is required.\");\n        }\n\n        if (IsNullOrWhiteSpace(options.ConnectionString) == (options.DataSource is null))\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': configure exactly one of {nameof(options.ConnectionString)} or {nameof(options.DataSource)}.\");\n        }\n\n        if (options.MaxAttempts < 0)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.MaxAttempts)} must be greater than zero.\");\n        }\n\n        if (options.VisibilityTimeout < TimeSpan.Zero)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.VisibilityTimeout)} must be greater than zero.\");\n        }\n\n        if (options.EvictionInterval < TimeSpan.Zero)","sourceCodeStart":1,"sourceCodeEnd":33,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AdoNet/Orleans.Streaming.AdoNet/AdoNetStreamOptionsValidator.cs#L1-L33","documentation":"Thrown by the ADO.NET streaming options validator when Invariant is null or whitespace. AdoNetStreamOptions.Invariant defaults to null, so it must be set explicitly so the provider knows which database driver and query dialect to use for the stream queues.","triggerScenarios":"ValidateConfiguration() runs on AdoNetStreamOptions with a blank Invariant. Triggered at host startup when AddAdoNetStreams is registered without setting Invariant for the named provider.","commonSituations":"Adding an ADO.NET stream provider with only a connection string; assuming Invariant is inherited from clustering/storage; copy-paste config that omits the Invariant key.","solutions":["Set options.Invariant = AdoNetInvariants.InvariantNameSqlServer (or the relevant driver) for the provider.","Use the AddAdoNetStreams overload with a configure delegate that sets Invariant.","Ensure the stream provider section in appsettings.json includes an Invariant key."],"exampleFix":"// before\nbuilder.AddAdoNetStreams(\"ads\", o =>\n{\n    o.ConnectionString = \"Server=.;Database=Orleans;\";\n});\n\n// after\nbuilder.AddAdoNetStreams(\"ads\", o =>\n{\n    o.Invariant = AdoNetInvariants.InvariantNameSqlServer;\n    o.ConnectionString = \"Server=.;Database=Orleans;\";\n});","handlingStrategy":"validation","validationCode":"static void CheckStreamInvariant(AdoNetStreamOptions o)\n{\n    if (string.IsNullOrWhiteSpace(o.Invariant))\n        throw new InvalidOperationException(\"AdoNetStreamOptions.Invariant is required.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set Invariant explicitly per stream provider — it has no default.","Reference AdoNetInvariants constants.","Add a config test asserting each provider's Invariant is non-blank."],"tags":["configuration","adonet","streaming","invariant","startup-validation"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}