{"record":{"id":"f0e54553e5fe2261","repo":"dotnet/efcore","slug":"the-parameter-parameter-for-the-dbfunction-f","errorCode":null,"errorMessage":"The parameter '{parameter}' for the DbFunction '{function}' has an invalid type '{type}'. Ensure the parameter type can be mapped by the current provider.","messagePattern":"The parameter '(.+?)' for the DbFunction '(.+?)' has an invalid type '(.+?)'\\. Ensure the parameter type can be mapped by the current provider\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs","lineNumber":406,"sourceCode":"            {\n                throw new InvalidOperationException(\n                    RelationalStrings.DbFunctionInvalidReturnEntityType(\n                        dbFunction.ModelName, dbFunction.ReturnType.ShortDisplayName(), elementType.ShortDisplayName()));\n            }\n\n            if ((entityType.BaseType != null || entityType.GetDerivedTypes().Any())\n                && entityType.FindDiscriminatorProperty() == null)\n            {\n                throw new InvalidOperationException(\n                    RelationalStrings.TableValuedFunctionNonTph(dbFunction.ModelName, entityType.DisplayName()));\n            }\n        }\n\n        foreach (var parameter in dbFunction.Parameters)\n        {\n            if (parameter.TypeMapping == null)\n            {\n                throw new InvalidOperationException(\n                    RelationalStrings.DbFunctionInvalidParameterType(\n                        parameter.Name,\n                        dbFunction.ModelName,\n                        parameter.ClrType.ShortDisplayName()));\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Validates the function mapping for an entity type.\n    /// </summary>\n    /// <param name=\"entityType\">The entity type to validate.</param>\n    /// <param name=\"logger\">The logger to use.</param>\n    protected virtual void ValidateDbFunctionMapping(\n        IEntityType entityType,\n        IDiagnosticsLogger<DbLoggerCategory.Model.Validation> logger)\n    {\n        var mappedFunctionName = entityType.GetFunctionName();","sourceCodeStart":388,"sourceCodeEnd":424,"githubUrl":"https://github.com/dotnet/efcore/blob/3a2006ef569de08368d59db5e1468aa8f407e4f8/src/EFCore.Relational/Infrastructure/RelationalModelValidator.cs#L388-L424","documentation":"Thrown when any parameter of a DbFunction has a null TypeMapping, meaning the relational provider cannot translate the parameter's CLR type to a store column type. The loop at RelationalModelValidator.cs:402-412 iterates dbFunction.Parameters after the return-type checks and throws DbFunctionInvalidParameterType for the first parameter whose TypeMapping is null.","triggerScenarios":"Declaring a DbFunction method with a parameter type the provider doesn't natively support (e.g., a custom struct, object, ulong on some providers, an enum without conversion, an unmapped record). Also when a value converter is required but not registered, or the provider lacks a mapping for System.DateOnly/TimeOnly on older versions.","commonSituations":"Upgrading/downgrading the database provider so a previously-mapped type is no longer supported; passing a complex value type; using a domain enum that needs HasConversion<T>() at the parameter level; custom ITypeMappingSource plugins not loaded.","solutions":["Change the DbFunction parameter to a primitive the provider maps (int, string, Guid, DateTime, decimal, byte[], etc.).","If you must take an unsupported CLR type, split/wrap it: pass its serialized representation (e.g., string) and parse server-side or convert before calling.","Register a value converter for the type at the model level so a mapping is found, or supply a custom IRelationalTypeMappingSource.","Upgrade the provider package (Microsoft.Data.Sqlite / Npgsql / Pomelo / SqlServer) to a version that maps the type (e.g., DateOnly/TimeOnly)."],"exampleFix":"// before — ulong not mapped by SqlServer provider\npublic IQueryable<Order> OrdersAbove(ulong minId)\n    => FromExpression(() => OrdersAbove(minId));\n\n// after — pass a mapped type\npublic IQueryable<Order> OrdersAbove(long minId)\n    => FromExpression(() => OrdersAbove(minId));","handlingStrategy":"validation","validationCode":"// For each DbFunction parameter, confirm a relational type mapping exists.\nvar relational = modelBuilder.Model.GetRelationalModel();\nforeach (var dbFn in modelBuilder.Model.GetDbFunctions())\n{\n    foreach (var p in dbFn.Parameters)\n    {\n        if (p.TypeMapping is null)\n            throw new InvalidOperationException($\"DbFunction '{dbFn.Name}' parameter '{p.Name}' (CLR {p.ClrType.Name}) has no provider mapping.\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try { _ = ctx.Model; }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"has an invalid type\"))\n{\n    logger.LogError(\"DbFunction parameter type unmapped by provider. {Msg}\", ex.Message);\n    throw;\n}","preventionTips":["Restrict DbFunction parameter types to primitives the provider documents as supported.","After upgrading a provider package, re-run model validation in a smoke test.","For enums/custom structs, register a value converter or pass a primitive surrogate."],"tags":["efcore","relational","dbfunction","type-mapping","provider","model-validation"],"backgroundTag":null,"analyzedSha":"3a2006ef569de08368d59db5e1468aa8f407e4f8","analyzedAt":"2026-08-11T23:42:04.146Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}