If using EF 4.1 or later, change "ObjectParameter" to "SqlParameter" and "ExecuteFunction" to "ExecuteStoreQuery" in your Context.cs file.
The ExecuteStoreQuery method also expects you to add parameter names before the stored proc. Find the snippet below:
var param1Parameter = param1 != null ? new SqlParameter("param1", param1) : new SqlParameter("param1", typeof(string)); var param2Parameter = param2 != null ? new SqlParameter("param2", param2) : new SqlParameter("param2", typeof(int)); return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<sp_TestSproc_Result>("sp_TestSproc @param1, @param2", param1Parameter, param2Parameter);
If you use a template to generate code, you can also find the snippet below useful. That is, I modified the standard Fluent TT generator in accordance with EF 4.3:
void WriteFunctionImport(EdmFunction edmFunction, bool includeMergeOption) { var parameters = FunctionImportParameter.Create(edmFunction.Parameters, Code, EFTools); var paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray()); var returnType = edmFunction.ReturnParameter == null ? null : EFTools.GetElementType(edmFunction.ReturnParameter.TypeUsage); var processedReturn = returnType == null ? "int" : "ObjectResult<" + MultiSchemaEscape(returnType) + ">"; if (includeMergeOption) { paramList = Code.StringAfter(paramList, ", ") + "MergeOption mergeOption"; } #> <#=AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction))#> <#=processedReturn#> <#=Code.Escape(edmFunction)#>(<#=paramList#>) { <#+ if(returnType != null && (returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType || returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.ComplexType)) { #> ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(<#=MultiSchemaEscape(returnType)#>).Assembly); <#+ } foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) { var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; var notNullInit = "new SqlParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")"; var nullInit = "new SqlParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + parameter.RawClrTypeName + "))"; #> var <#=parameter.LocalVariableName#> = <#=isNotNull#> ? <#=notNullInit#> : <#=nullInit#>; <#+ } var genericArg = returnType == null ? "" : "<" + MultiSchemaEscape(returnType) + ">"; var callParams = Code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())); var spParams = Code.StringBefore("@", String.Join(", @", parameters.Select(p => p.EsqlParameterName).ToArray())); if (includeMergeOption) { callParams = ", mergeOption" + callParams; } #> return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<#=genericArg#>("<#=edmFunction.Name#> <#=spParams#>" <#=callParams#>); } <#+ if(!includeMergeOption && returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType) { WriteFunctionImport(edmFunction, true); } }
Kwex
source share