{"record":{"id":"13cfeb48b36653d7","repo":"dotnet/orleans","slug":"invalid-nameof-adonetgraindirectoryoptions-valu","errorCode":null,"errorMessage":"Invalid {nameof(AdoNetGrainDirectoryOptions)} values for {nameof(AdoNetGrainDirectory)}|{name}. {nameof(options)} 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":15,"sourceCode":"using static System.String;\n\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":1,"sourceCodeEnd":29,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AdoNet/Orleans.GrainDirectory.AdoNet/Options/AdoNetGrainDirectoryOptionsValidator.cs#L1-L29","documentation":"Thrown by the ADO.NET grain directory options validator when the resolved AdoNetGrainDirectoryOptions instance is null. This is a dependency-injection failure: the options object could not be constructed/resolved by the DI container before validation ran. In practice it signals a misregistered or missing named options registration.","triggerScenarios":"ValidateConfiguration() is called on an AdoNetGrainDirectoryOptionsValidator whose `options` constructor parameter resolved to null. Happens when the grain directory was registered without a matching named AdoNetGrainDirectoryOptions binding, or when a custom DI container returns null for that service.","commonSituations":"Registering a named grain directory (\"MyDirectory\") without a corresponding Configure<AdoNetGrainDirectoryOptions>(\"MyDirectory\", ...); using a custom IServiceProvider that returns default(null) for options; misordered DI registrations.","solutions":["Register AdoNetGrainDirectoryOptions via Configure/ConfigureOptions for the same name used when adding the grain directory.","Use the AddAdoNetGrainDirectory extension helper which wires the options binding for you.","Verify the options name string matches between AddAdoNetGrainDirectory(name) and Configure<AdoNetGrainDirectoryOptions>(name)."],"exampleFix":"// before\nbuilder.AddAdoNetGrainDirectory(\"MyDirectory\");\n// options never configured -> resolves null in some containers\n\n// after\nbuilder.AddAdoNetGrainDirectory(\"MyDirectory\", options =>\n{\n    options.Invariant = AdoNetInvariants.InvariantNameSqlServer;\n    options.ConnectionString = \"Server=.;Database=Orleans;Trusted_Connection=True;\";\n});","handlingStrategy":"validation","validationCode":"// Verify the named options resolve before validation runs.\nvar resolved = serviceProvider.GetService<IOptionsMonitor<AdoNetGrainDirectoryOptions>>()?.Get(name);\nif (resolved is null) throw new InvalidOperationException($\"AdoNetGrainDirectoryOptions '{name}' not registered.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair AddAdoNetGrainDirectory(name) with a Configure delegate of the same name.","Prefer the configure-options overload of the registration extension.","Add an integration test that resolves each named options from the DI container."],"tags":["configuration","adonet","grain-directory","dependency-injection","startup-validation"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}