Services RIA - appeler une procédure stockée

entity-framework silverlight wcf-ria-services

Question

J'utilise les services RIA avec Silverlight et Entity Framework. Je souhaite appeler une procédure stockée et mapper les résultats sur une grille de données. Quelle est la meilleure façon de procéder? La sortie de la procédure stockée ne correspond à aucune conception de table.

J'ai trouvé l'article suivant -

http://blogs.msdn.com/b/tom/archive/2009/05/07/silverlight-ria-calling-stored-procedures-that-don-t-return-tables.aspx

Cependant, cela ne fonctionne pas pour moi - je reçois une erreur en disant que le jeu complexe de résultats n'a pas de clé primaire définie. Je ne vois pas comment définir cela dans le code.

Quoi qu'il en soit, je suis ouvert à toutes les solutions.

Réponse acceptée

J'ai trouvé l'excellent guide suivant, étape par étape, sur ce site -

http://betaforums.silverlight.net/forums/p/218383/521023.aspx

1) Ajoutez un modèle de données d'entité ADO à votre projet Web. Sélectionnez l'option Générer à partir de la base de données. Sélectionnez votre instance de base de données à laquelle vous connecter.

2) Choisissez votre objet de base de données à importer dans le modèle. Vous pouvez développer le noeud Table pour sélectionner la table à importer dans le modèle. Développez le noeud Procédure stockée pour sélectionner également votre procédure stockée. Cliquez sur Terminer pour terminer l'importation.

3) Cliquez avec le bouton droit sur le concepteur de modèle de base de données pour sélectionner Ajouter / Importer une fonction. Attribuez un nom à la fonction (le même nom que votre SP conviendrait) et sélectionnez la procédure stockée que vous souhaitez mapper. Si votre SP ne renvoie qu'un seul champ, vous pouvez mapper le résultat renvoyé à une collection de scalaires. Si votre SP renvoie plusieurs champs, vous pouvez mapper le résultat renvoyé à une collection ou à une entité (si tous les champs proviennent d'une seule table) ou à une collection de types complexes.

Si vous souhaitez utiliser le type complexe, vous pouvez cliquer sur le bouton Obtenir une colonne pour obtenir toutes les colonnes de votre SP. Cliquez ensuite sur le bouton Créer un nouveau type de complexe pour créer ce type de complexe.

4) Ajoutez une classe de service de domaine au projet Web. Sélectionnez le DataModel que vous venez de créer en tant que DataContext de ce service. Sélectionnez toutes les entités que vous souhaitez exposer au client. Les fonctions de service doivent être générées pour ces entités.

5) Vous pouvez ne pas voir le type de complexe dans la liste des entités. Vous devez ajouter une fonction de requête pour votre SP dans votre service: supposez que votre SP s'appelle SP1, le type de complexe que vous avez généré s'appelle SP1_Result.

Ajoutez le code suivant dans votre classe de service de domaine:

public IQueryable<SP1_Result> SP1()
    {
        return this.ObjectContext.SP1().AsQueryable();            
    }

Maintenant, vous pouvez compiler votre projet. Vous pourriez obtenir une erreur comme celle-ci: "SP1_Result n'a pas de clé" (si vous n'êtes pas sur le service RIA SP1 bêta). Si vous le faites, vous devez effectuer les opérations suivantes dans le fichier de métadonnées de service:

Ajout d'une classe de métadonnées SP1_Result et étiquetage du champ Key:

[MetadataTypeAttribute(typeof(SP1_Result.SP1_ResultMetadata))]
public partial class SP1_Result
{
    internal sealed class SP1_ResultMetadata
    {
        [Key]
        public int MyId;  // Change MyId to the ID field of your SP_Result
    }
} 

6) Compilez votre solution. Vous avez maintenant SP1_Result exposé au client. Vérifiez le fichier généré, vous devriez voir SP1_Result est généré en tant que classe d'entité. Vous pouvez maintenant accéder à DomainContext.SP1Query et DomainContext.SP1_Results dans votre code Silverlight. Vous pouvez le traiter comme vous le feriez avec n'importe quelle classe d'entité (l'entité mappée sur une table).


Réponse populaire

Eh bien, j'ai compris comment le faire, même si c'est un peu compliqué. Vous devez créer une classe de métadonnées pour le jeu de résultats dans le fichier de métadonnées du domaine. Après cela, RIA le traitera essentiellement comme s'il s'agissait d'une entité.

Vous trouverez tous les détails ici: http://leeontech.wordpress.com/2010/05/24/ria-services-and-storedprocedures/



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow