{"record":{"id":"4470fb6e25980997","repo":"dotnet/efcore","slug":"current-value-parameter-parameter-is-not-allow","errorCode":null,"errorMessage":"Current value parameter '{parameter}' is not allowed on delete stored procedure '{sproc}'. Use HasOriginalValueParameter() instead.","messagePattern":"Current value parameter '(.+?)' is not allowed on delete stored procedure '(.+?)'\\. Use HasOriginalValueParameter\\(\\) instead\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs","lineNumber":732,"sourceCode":"                    if (storeObjectIdentifier.StoreObjectType == StoreObjectType.InsertStoredProcedure)\n                    {\n                        throw new InvalidOperationException(\n                            RelationalStrings.StoredProcedureOriginalValueParameterOnInsert(\n                                parameter.Name, storeObjectIdentifier.DisplayName()));\n                    }\n                }\n                else\n                {\n                    if (!properties.TryGetAndRemove(parameter.PropertyName, out property))\n                    {\n                        throw new InvalidOperationException(\n                            RelationalStrings.StoredProcedureParameterNotFound(\n                                parameter.PropertyName, entityType.DisplayName(), storeObjectIdentifier.DisplayName()));\n                    }\n\n                    if (storeObjectIdentifier.StoreObjectType == StoreObjectType.DeleteStoredProcedure)\n                    {\n                        throw new InvalidOperationException(\n                            RelationalStrings.StoredProcedureCurrentValueParameterOnDelete(\n                                parameter.Name, storeObjectIdentifier.DisplayName()));\n                    }\n\n                    if (parameter.Direction.HasFlag(ParameterDirection.Input))\n                    {\n                        switch (storeObjectIdentifier.StoreObjectType)\n                        {\n                            case StoreObjectType.InsertStoredProcedure:\n                                if (property.GetBeforeSaveBehavior() != PropertySaveBehavior.Save)\n                                {\n                                    throw new InvalidOperationException(\n                                        RelationalStrings.StoredProcedureInputParameterForInsertNonSaveProperty(\n                                            parameter.Name,\n                                            storeObjectIdentifier.DisplayName(),\n                                            parameter.PropertyName,\n                                            entityType.DisplayName(),\n                                            property.GetBeforeSaveBehavior()));","sourceCodeStart":714,"sourceCodeEnd":750,"githubUrl":"https://github.com/dotnet/efcore/blob/dbf9771522148d61a2467854921bd5dc6f6e6916/src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs#L714-L750","documentation":"Thrown when a current-value parameter (HasParameter) is configured on a Delete stored procedure. Deletes only consume original values (e.g. keys and concurrency tokens), not current values. The validator rejects non-original-value parameters on delete sprocs and suggests HasOriginalValueParameter.","triggerScenarios":".DeleteStoredProcedure().HasParameter(\"RowVersion\"); using current-value parameter config on a delete sproc, typically for a concurrency token.","commonSituations":"Copy-pasting insert/update parameter config onto a delete sproc; assuming a concurrency token should be a current-value param.","solutions":["Replace HasParameter with HasOriginalValueParameter on the delete sproc.","Remove the parameter if it is not needed for the delete operation."],"exampleFix":"// before\n.DeleteStoredProcedure(\"sp_DeleteBlog\", sp =>\n{\n    sp.HasParameter(\"RowVersion\");\n});\n\n// after\n.DeleteStoredProcedure(\"sp_DeleteBlog\", sp =>\n{\n    sp.HasOriginalValueParameter(\"RowVersion\");\n});","handlingStrategy":"validation","validationCode":"foreach (var et in modelBuilder.Model.GetEntityTypes())\n{\n    var del = et.GetDeleteStoredProcedure();\n    if (del != null && del.Parameters.Any(p => p.ForOriginalValue != true && p.PropertyName != null))\n        throw new InvalidOperationException($\"{et.DisplayName()} delete sproc has current-value params\");\n}","typeGuard":null,"tryCatchPattern":"try { _ = ctx.Model; } catch (InvalidOperationException ex) when (ex.Message.Contains(\"not allowed on delete stored procedure\")) { /* replace HasParameter with HasOriginalValueParameter */ }","preventionTips":["On delete sprocs use HasOriginalValueParameter for keys and concurrency tokens, never HasParameter."],"tags":["ef-core","stored-procedures","parameters","delete","model-validation"],"analyzedSha":"dbf9771522148d61a2467854921bd5dc6f6e6916","analyzedAt":"2026-08-06T20:46:03.226Z","schemaVersion":2},"datasetVersion":"2026-08-07T02:17:10.218Z"}