6

ich mit Entity Framework Tabellenwertfunktionen bin mit 5. ich diesen Fehler nur erhalten:Entity Framework - Tabellenwertfunktionen - Parameter ist bereits vorhanden

A parameter named 'EffectiveDate' already exists in the parameter collection. Parameter names must be unique in the parameter collection. Parameter name: parameter

Es wird von mir, die Anrufe zu Tisch Beitritt verursacht wird -bewertete Funktionen, die denselben Parameter verwenden.

Ist das ein Fehler/Einschränkung mit EF? Gibt es eine Problemumgehung? Im Moment erzeuge ich automatisch den Code (.edmx Datei).

Antwort

0

Kein Fehler. Vielleicht eine Einschränkung oder eine Unterlassung. Anscheinend wurde dieser Anwendungsfall nie berücksichtigt. EF könnte automatisch erstellte Parameternamen verwenden, aber, ja, tut es einfach nicht.

Sie müssen zum Aufruf einer der Funktionen mit .AsEnumerable() greifen. Aus irgendeinem Grund muss dies die erste Funktion im Join sein (wie ich es erlebt habe). Wenn Sie die zweite Funktion mit .AsEnumerable() aufrufen, wird es weiterhin in SQL übersetzt und der Name Kollision tritt weiterhin auf.

9

Es wäre wirklich nett, wenn Microsoft Parameternamen, zumindest auf einer Kontextbasis, einzigartig machen würde.

Ich habe ein Problem für diese here erstellt.

In der Zwischenzeit konnte ich dies durch Tweaking einiger Funktionen in der .Context.tt Datei zur Arbeit kommen, so dass es eine GUID zu jedem Parameternamen zur Laufzeit ergänzt:

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()))); 
}