2010-08-24 2 views
0

J'utilise VS2010, Entity Framework 4.0 et Advantage v. 10 dans mon application. J'essaye de faire un UDF que j'ai défini dans mon DB d'avantage disponible à mon code d'application. Le concepteur n'affiche pas le fichier UDF sous des processus stockés dans l'assistant «Mettre à jour le modèle à partir de la base de données» comme je le souhaiterais. Donc, j'ai ajouté manuellement l'UDF au SSDL comme suit:framework d'infrastructure + base de données d'avantages: UDF

<Function Name="Test" ReturnType="numeric" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion"> 
     <Parameter Name="PartID" Type="integer" Mode="In"/> 
    </Function> 

J'ai aussi ajouté un talon de méthode CLR:

[EdmFunction("namespace.Store", "Test")] 
    public static decimal Test(int partID) 
    { 
     throw new InvalidOperationException("Call from within an L2E query"); 
    } 

Je peux voir la fonction dans ma déclaration Linq-à-entités; cependant, le SQL généré n'est pas valide. En utilisant ToTraceString, l'appel UDF ressemble à ceci:

"namespace.Store"."Test"("Project3"."PartID") AS "C4" 

Cela me donne l'erreur suivante:

System.Data.EntityCommandExecutionException: Une erreur est survenue lors de l'exécution de la définition de la commande. Voir l'exception interne pour plus de détails. ---> Advantage.Data.Provider.AdsException: Erreur 7200: Erreur AQE: State = 42000; NativeError = 2117; [Solutions iAnywhere] [Moteur SQL Advantage] Jeton inattendu: le nom de la fonction scalaire ne doit pas être délimité.

Il fonctionne très bien si je lance le SQL généré dans Advantage Data Architect et corriger le nom de la fonction comme ceci:

 Test("Project3"."PartID") AS "C4" 

est-il de toute façon de dire Entity Framework pour générer le SQL correct? Est-ce que je fais quelque chose de mal dans la définition de la fonction dans le SSDL?

Merci d'avance.

Répondre

0

Vous devez changer votre élément de fonction pour BuiltIn="true". Les fonctions définies par l'utilisateur ne sont pas indiquées dans la grammaire Advantage SQL.

+0

J'ai essayé beaucoup de combinaisons différentes des propriétés, mais j'ai supposé que BuiltIn signifiait des fonctions DB système natives. Des trucs géniaux! – user429994

Questions connexes