Zur Zeit wird gefiltert nach: efprovidertoolkit
Filter zurücksetzen
Entity Framework 4 - EfCachingProvider und die System.NotSupportedException: Command tree type System.Data.Common.CommandTrees. DbFunctionCommandTree is not supported bei Ausführung von gespeicherten Prozeduren
Ich habe die neue Version des EFProviderToolkits heruntergeladen. Bei der Ausführung von Prozeduren hatte auch die frühere Version Probleme. Wie ich es dennoch in den Griff bekommen habe, ist hier beschrieben.
Nun stand ich wieder an einer ähnlichen Stelle an. Der Code wurde überarbeitet, theoretisch lassen sich auch die gespeicherten Prozeduren ausführen. Theoretisch, denn der Caching Provider quittiert mir die Ausführung mit der Fehlermeldung:
System.NotSupportedException: Command tree type System.Data.Common.CommandTrees.DbFunctionCommandTree is not supported.
Bei der neuen Version tritt der Fehler jedoch in der Datei EFCommandDefinition.cs auf, also machte ich mich dort auf die Suche. Fündig wurde ich in der Methode GetAffectedEntitySets.
Dort werden die Tree-Kommandos geparst und der Visitor angeheftet. Die Methode DbFunctionCommandTree fehlt jedoch in dieser Methode und dadurch wird eine Ausnahme ausgelöst, die in Zeile 170 steht.
Also habe ich in der Methode diesen Part hinzugefügt und konnte so das Problem in den Griff bekommen. Da ich in diesem Projekt nur gespeicherte Prozeduren ohne Rückgabewert aufrufe, bleibt die Basisfunktionalität des Caching Providers erhalten.
Die angepasste Methode im Projekt EFCachingProivder sieht wie folgt aus:
private void GetAffectedEntitySets(DbCommandTree commandTree)
{
FindAffectedEntitySetsVisitor visitor = new FindAffectedEntitySetsVisitor(this.affectedEntitySets, this.functionsUsed);
DbQueryCommandTree queryTree = commandTree as DbQueryCommandTree;
if (queryTree != null)
{
queryTree.Query.Accept(visitor);
return;
}
DbUpdateCommandTree updateTree = commandTree as DbUpdateCommandTree;
if (updateTree != null)
{
this.IsModification = true;
updateTree.Target.Expression.Accept(visitor);
updateTree.Predicate.Accept(visitor);
if (updateTree.Returning != null)
{
updateTree.Returning.Accept(visitor);
}
return;
}
DbInsertCommandTree insertTree = commandTree as DbInsertCommandTree;
if (insertTree != null)
{
this.IsModification = true;
insertTree.Target.Expression.Accept(visitor);
if (insertTree.Returning != null)
{
insertTree.Returning.Accept(visitor);
}
return;
}
DbDeleteCommandTree deleteTree = commandTree as DbDeleteCommandTree;
if (deleteTree != null)
{
this.IsModification = true;
deleteTree.Target.Expression.Accept(visitor);
if (deleteTree.Predicate != null)
{
deleteTree.Predicate.Accept(visitor);
}
return;
}
// Modification for store procedures support without caching
DbFunctionCommandTree funcTree = commandTree as DbFunctionCommandTree;
if (funcTree != null)
{
return;
}
throw new NotSupportedException("Command tree type " + commandTree.GetType() + " is not supported.");
}
Second Level Cache ist in manchen Situationen schon sehr hilfreich und die Ecken und Kanten in diesem Toolkit lassen sich immer noch anpassen. ;-)
Social Bookmarking