Entity Framework - Table-Valued Functions - Parameter Already Exists -
i using table-valued functions entity framework 5. received error:
a parameter named 'effectivedate' exists in parameter collection. parameter names must unique in parameter collection. parameter name: parameter
it being caused me joining calls table-valued functions taking same parameter.
is bug/limitation ef? there workaround? right auto-generating code (.edmx file).
it nice if microsoft make parameter names unique, @ least on per-context basis.
i've created issue here.
in meantime, able work tweaking few functions in .context.tt file, adds guid each parameter name @ runtime:
private void writefunctionimport(typemapper typemapper, codestringgenerator codestringgenerator, edmfunction edmfunction, string modelnamespace, bool includemergeoption) { if (typemapper.iscomposable(edmfunction)) { #> [edmfunction("<#=edmfunction.namespacename#>", "<#=edmfunction.name#>")] <#=codestringgenerator.composablefunctionmethod(edmfunction, modelnamespace)#> { var guid = guid.newguid().tostring("n"); <#+ codestringgenerator.writefunctionparameters(edmfunction, " + guid", writefunctionparameter); #> <#=codestringgenerator.composablecreatequery(edmfunction, modelnamespace)#> } <#+ } else { #> <#=codestringgenerator.functionmethod(edmfunction, modelnamespace, includemergeoption)#> { <#+ codestringgenerator.writefunctionparameters(edmfunction, "", writefunctionparameter); #> <#=codestringgenerator.executefunction(edmfunction, modelnamespace, includemergeoption)#> } <#+ if (typemapper.generatemergeoptionfunction(edmfunction, includemergeoption)) { writefunctionimport(typemapper, codestringgenerator, edmfunction, modelnamespace, includemergeoption: true); } } } ...
public void writefunctionparameters(edmfunction edmfunction, string namesuffix, action<string, string, string, string> writeparameter) { var parameters = functionimportparameter.create(edmfunction.parameters, _code, _ef); foreach (var parameter in parameters.where(p => p.needslocalvariable)) { var isnotnull = parameter.isnullableoft ? parameter.functionparametername + ".hasvalue" : parameter.functionparametername + " != null"; var notnullinit = "new objectparameter(\"" + parameter.esqlparametername + "\"" + namesuffix + ", " + parameter.functionparametername + ")"; var nullinit = "new objectparameter(\"" + parameter.esqlparametername + "\"" + namesuffix + ", typeof(" + parameter.rawclrtypename + "))"; writeparameter(parameter.localvariablename, isnotnull, notnullinit, nullinit); } } ...
public string composablecreatequery(edmfunction edmfunction, string modelnamespace) { var parameters = _typemapper.getparameters(edmfunction); return string.format( cultureinfo.invariantculture, "return ((iobjectcontextadapter)this).objectcontext.createquery<{0}>(\"[{1}].[{2}]({3})\"{4});", _typemapper.gettypename(_typemapper.getreturntype(edmfunction), modelnamespace), edmfunction.namespacename, edmfunction.name, string.join(", ", parameters.select(p => "@" + p.esqlparametername + "\" + guid + \"").toarray()), _code.stringbefore(", ", string.join(", ", parameters.select(p => p.executeparametername).toarray()))); }
Comments
Post a Comment