{"record":{"id":"80e749e5c365c325","repo":"dotnet/orleans","slug":"invalid-nameof-adonetgrainstorageoptions-values","errorCode":null,"errorMessage":"Invalid {nameof(AdoNetGrainStorageOptions)} values for {nameof(AdoNetGrainStorage)} \"{name}\". {nameof(options.Invariant)} is required.","messagePattern":"Invalid (.+?) values for (.+?) \"(.+?)\"\\. (.+?) is required\\.","errorType":"validation","errorClass":"OrleansConfigurationException","httpStatus":null,"severity":"error","filePath":"src/AdoNet/Orleans.Persistence.AdoNet/Options/AdoNetGrainStorageOptions.cs","lineNumber":97,"sourceCode":"        private readonly string name;\n\n        /// <summary>\n        /// Constructor\n        /// </summary>\n        /// <param name=\"configurationOptions\">The option to be validated.</param>\n        /// <param name=\"name\">The name of the option to be validated.</param>\n        public AdoNetGrainStorageOptionsValidator(AdoNetGrainStorageOptions configurationOptions, string name)\n        {\n            this.options = configurationOptions ?? throw new OrleansConfigurationException($\"Invalid AdoNetGrainStorageOptions for AdoNetGrainStorage {name}. Options is required.\");\n            this.name = name;\n        }\n\n        /// <inheritdoc cref=\"IConfigurationValidator\"/>\n        public void ValidateConfiguration()\n        {\n            if (string.IsNullOrWhiteSpace(this.options.Invariant))\n            {\n                throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetGrainStorageOptions)} values for {nameof(AdoNetGrainStorage)} \\\"{name}\\\". {nameof(options.Invariant)} is required.\");\n            }\n\n            if (string.IsNullOrWhiteSpace(this.options.ConnectionString) == (this.options.DataSource is null))\n            {\n                throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetGrainStorageOptions)} values for {nameof(AdoNetGrainStorage)} \\\"{name}\\\". Configure exactly one of {nameof(options.ConnectionString)} or {nameof(options.DataSource)}.\");\n            }\n\n            if (this.options.HashPicker == null)\n            {\n                throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetGrainStorageOptions)} values for {nameof(AdoNetGrainStorage)} {name}. {nameof(options.HashPicker)} is required.\");\n            }\n        }\n    }\n\n    /// <summary>\n    /// Provides default configuration HashPicker for AdoNetGrainStorageOptions.\n    /// </summary>\n    public class DefaultAdoNetGrainStorageOptionsHashPickerConfigurator : IPostConfigureOptions<AdoNetGrainStorageOptions>","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AdoNet/Orleans.Persistence.AdoNet/Options/AdoNetGrainStorageOptions.cs#L79-L115","documentation":"Thrown by the AdoNetGrainStorageOptionsValidator when Invariant is null or whitespace. AdoNetGrainStorageOptions.Invariant defaults to SQL Server, so this only fires if the default was explicitly cleared to empty or the options object was constructed/serialized without populating Invariant.","triggerScenarios":"ValidateConfiguration() runs with options.Invariant explicitly set to \"\" or null, overriding the DEFAULT_ADONET_INVARIANT (SqlServer) default. Also possible if options are deserialized from config that has an empty Invariant key overriding the default.","commonSituations":"An appsettings.json \"Invariant\": \"\" entry that wipes the default; deserializing options from a source missing the Invariant field with a null-coercing binder; explicitly setting Invariant = null in code.","solutions":["Remove any empty \"Invariant\" override in configuration so the SQL Server default applies.","Set options.Invariant = AdoNetInvariants.InvariantNameSqlServer (or PostgreSql/MySql as needed) explicitly.","Bind options with a binder that preserves defaults rather than overwriting with null."],"exampleFix":"// before\n// appsettings.json: \"Invariant\": \"\"  (wipes default)\n\n// after\n// appsettings.json: omit Invariant, or:\n\"Invariant\": \"System.Data.SqlClient\"","handlingStrategy":"validation","validationCode":"static void CheckStorageInvariant(AdoNetGrainStorageOptions o)\n{\n    if (string.IsNullOrWhiteSpace(o.Invariant))\n        throw new InvalidOperationException(\"AdoNetGrainStorageOptions.Invariant must not be blank.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid setting \"Invariant\": \"\" in config, which overrides the SQL Server default.","Reference the invariant via AdoNetInvariants constants.","Add a config test asserting Invariant is non-blank after binding."],"tags":["configuration","adonet","grain-storage","invariant","startup-validation"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}