{"record":{"id":"8032a9677878c92a","repo":"dotnet/orleans","slug":"invalid-nameof-adonetgraindirectoryoptions-valu-8032a9","errorCode":null,"errorMessage":"Invalid {nameof(AdoNetGrainDirectoryOptions)} values for {nameof(AdoNetGrainDirectory)}|{name}. {nameof(options.Invariant)} is required.","messagePattern":"Invalid (.+?) values for (.+?)\\|(.+?)\\. (.+?) is required\\.","errorType":"validation","errorClass":"OrleansConfigurationException","httpStatus":null,"severity":"error","filePath":"src/AdoNet/Orleans.GrainDirectory.AdoNet/Options/AdoNetGrainDirectoryOptionsValidator.cs","lineNumber":20,"sourceCode":"\nnamespace Orleans.Configuration;\n\n/// <summary>\n/// Validates <see cref=\"AdoNetGrainDirectoryOptions\"/> configuration.\n/// </summary>\npublic class AdoNetGrainDirectoryOptionsValidator(AdoNetGrainDirectoryOptions options, string name) : IConfigurationValidator\n{\n    /// <inheritdoc />\n    public void ValidateConfiguration()\n    {\n        if (options is null)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetGrainDirectoryOptions)} values for {nameof(AdoNetGrainDirectory)}|{name}. {nameof(options)} is required.\");\n        }\n\n        if (IsNullOrWhiteSpace(options.Invariant))\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetGrainDirectoryOptions)} values for {nameof(AdoNetGrainDirectory)}|{name}. {nameof(options.Invariant)} is required.\");\n        }\n\n        if (IsNullOrWhiteSpace(options.ConnectionString) == (options.DataSource is null))\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetGrainDirectoryOptions)} values for {nameof(AdoNetGrainDirectory)}|{name}. Configure exactly one of {nameof(options.ConnectionString)} or {nameof(options.DataSource)}.\");\n        }\n    }\n}\n","sourceCodeStart":2,"sourceCodeEnd":29,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AdoNet/Orleans.GrainDirectory.AdoNet/Options/AdoNetGrainDirectoryOptionsValidator.cs#L2-L29","documentation":"Thrown by the ADO.NET grain directory options validator when the Invariant property is null or whitespace. The invariant (e.g. \"System.Data.SqlClient\") tells Orleans which ADO.NET driver and query dialect to use, and is mandatory because the grain directory has no default unlike grain storage.","triggerScenarios":"ValidateConfiguration() runs on AdoNetGrainDirectoryOptions whose Invariant was never set. AdoNetGrainDirectoryOptions.Invariant has no default (unlike storage which defaults to SQL Server), so any registration that omits the invariant triggers this.","commonSituations":"Adding a grain directory with only a connection string and forgetting the Invariant; assuming Invariant defaults to SQL Server (it does not for the grain directory); copy-paste from storage config where Invariant has a default.","solutions":["Set options.Invariant explicitly, e.g. AdoNetInvariants.InvariantNameSqlServer.","Use the AddAdoNetGrainDirectory overload that accepts a configure delegate and set Invariant there.","Double-check the configured section in appsettings.json includes an \"Invariant\" key."],"exampleFix":"// before\nbuilder.AddAdoNetGrainDirectory(\"dir\", o =>\n{\n    o.ConnectionString = \"Server=.;Database=Orleans;\";\n});\n\n// after\nbuilder.AddAdoNetGrainDirectory(\"dir\", o =>\n{\n    o.Invariant = AdoNetInvariants.InvariantNameSqlServer;\n    o.ConnectionString = \"Server=.;Database=Orleans;\";\n});","handlingStrategy":"validation","validationCode":"static void CheckGrainDirectory(AdoNetGrainDirectoryOptions o)\n{\n    if (string.IsNullOrWhiteSpace(o.Invariant))\n        throw new InvalidOperationException(\"AdoNetGrainDirectoryOptions.Invariant is required.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not assume Invariant defaults for the grain directory — set it explicitly.","Keep an invariant constant (e.g. AdoNetInvariants.InvariantNameSqlServer) referenced everywhere.","Validate the appsettings section contains an Invariant key in a config test."],"tags":["configuration","adonet","grain-directory","invariant","startup-validation"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}