{"record":{"id":"79783d8202c3a17a","repo":"elsa-workflows/elsa-core","slug":"runtime-entity-instance-instance-id-is-missing-required","errorCode":null,"errorMessage":"Runtime entity instance '{instance.Id}' is missing required field '{missingField.Name}'.","messagePattern":"Runtime entity instance '(.+?)' is missing required field '(.+?)'\\.","errorType":"validation","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/modules/Elsa.Persistence.VNext.Runtime/Services/RuntimeEntityDefinitionValidator.cs","lineNumber":37,"sourceCode":"\n        var maxIndexedFields = Math.Min(options.Value.MaxIndexedFields, RuntimeEntityPersistenceSchemaProvider.IndexedFieldSlotCount);\n        if (definition.Indexes.Count > maxIndexedFields)\n            throw new InvalidOperationException($\"Runtime entity definition '{definition.Name}' declares {definition.Indexes.Count} indexes, but only {maxIndexedFields} runtime index slots are available.\");\n\n        var fields = definition.Fields.Select(x => x.Name).ToHashSet(StringComparer.OrdinalIgnoreCase);\n        foreach (var index in definition.Indexes)\n        {\n            if (!fields.Contains(index.FieldName))\n                throw new InvalidOperationException($\"Runtime entity definition '{definition.Name}' index '{index.Name}' references unknown field '{index.FieldName}'.\");\n        }\n    }\n\n    public void ValidateInstance(RuntimeEntityDefinition definition, RuntimeEntityInstance instance)\n    {\n        var dataKeys = instance.Data.Keys.ToHashSet(StringComparer.OrdinalIgnoreCase);\n        var missingField = definition.Fields.FirstOrDefault(x => x.IsRequired && !dataKeys.Contains(x.Name));\n        if (missingField is not null)\n            throw new InvalidOperationException($\"Runtime entity instance '{instance.Id}' is missing required field '{missingField.Name}'.\");\n    }\n}\n","sourceCodeStart":19,"sourceCodeEnd":40,"githubUrl":"https://github.com/elsa-workflows/elsa-core/blob/fe9217bdfa0e27f0e09e45006eb6898f616e513d/src/modules/Elsa.Persistence.VNext.Runtime/Services/RuntimeEntityDefinitionValidator.cs#L19-L40","documentation":"ValidateInstance checks a runtime entity instance against its definition: every field marked IsRequired must have a key present in instance.Data (case-insensitive comparison). Missing required data means the instance cannot be persisted completely, so it throws InvalidOperationException.","triggerScenarios":"Calling ValidateInstance where at least one required definition field has no corresponding key in the instance's Data dictionary.","commonSituations":"Producing instances from producers that omit fields when values are null; schema evolved to add a required field while older producers still emit instances without it; deserialization dropping null-valued properties.","solutions":["Populate every required field in instance.Data before validating/saving.","Temporarily mark the field IsRequired = false in the definition if it is genuinely optional.","When loading legacy data, backfill missing required fields during migration or a read-time default step."],"exampleFix":"// before\nvar instance = new RuntimeEntityInstance { Id = id, Data = { [\"Name\"] = name } }; // OccurredAt is required\n// after\nvar instance = new RuntimeEntityInstance { Id = id, Data = { [\"Name\"] = name, [\"OccurredAt\"] = DateTimeOffset.UtcNow } };","handlingStrategy":"validation","validationCode":"var dataKeys = instance.Data.Keys.ToHashSet(StringComparer.OrdinalIgnoreCase);\nvar missing = definition.Fields.Where(f => f.IsRequired && !dataKeys.Contains(f.Name)).ToList();\nif (missing.Count > 0) throw new InvalidOperationException($\"Instance '{instance.Id}' missing required fields: {string.Join(\", \", missing.Select(m => m.Name))}\");","typeGuard":null,"tryCatchPattern":"try { validator.ValidateInstance(definition, instance); }\ncatch (InvalidOperationException ex) { logger.LogError(ex, \"Invalid instance {Id}\", instance.Id); throw; }","preventionTips":["Construct instances through a factory that always sets required fields.","Backfill required fields when migrating schemas.","Avoid serializing instances with null-stripping that drops required keys."],"tags":["validation","runtime-entities","required-fields"],"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-23T08:17:48.524Z"}