Exemple d'application d'entreprises avec Silverlight 3 et .NET RIA Services - Partie 24 - Procédures stockées

Cet article fait partie d'une série de traductions d'articles de Brad Abrams sur le développement d'applications métier avec Silverlight et .NET RIA Services.

Retrouvez l'ensemble des articles de la série sur cette page : Exemple d'application métier pour Silverlight 3 et .NET RIA Services.

Commentez cet article : Commentez Donner une note à l'article (5).

Article lu   fois.

Les deux auteurs

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

1. Introduction

Je continue à mettre à jour ma présentation du Mix 09 sur Silverlight 3 + RIA Services avec de nouveaux trucs fun.
Bien que les nombreux exemples avec RIA Services que nous avons montrés jusqu'à présent effectuent des requêtes CRUD directement sur les tables de base de données, je reconnais certainement que de nombreux scénarios exigent l'aide de procédures stockées dans la base de données pour encapsuler tous les accès aux données.

Vous pouvez voir la série complète ici.  Cette démo nécessite les éléments suivants (tout est 100 % gratuit) :

Consultez le site en ligne et téléchargez les fichiers de la démo.

Dans cet exemple, je vais encapsuler tous les accès aux données dans des procédures stockées. Je vais continuer à utiliser Entity Framework pour accéder à ces procédures stockées, mais vous pourriez bien sûr utiliser LinqToSql ou ADO.NET directement.

2. Ajouter des procédures stockées

La première étape consiste à créer un ensemble de procédures stockées dans la base de données.
Dans l'Explorateur de serveurs, ouvrez la base de données, sélectionnez le nœud Procédures stockées et "Créer une nouvelle procédure stockée".

Image non disponible

Elles sont très, très basiques. Mon but ici est de vous montrer comment démarrer, vous pouvez ensuite ajouter toute logique supplémentaire dont vous auriez besoin, tout en suivant le même schéma général de base.
Commençons par l'ajout de certaines procédures stockées :

 
Sélectionnez

ALTER PROCEDURE dbo.CoolSuperEmployees

AS

SELECT  SuperEmployees.Name, SuperEmployees.EmployeeID,SuperEmployees.Gender,SuperEmployees.Origin,SuperEmployees.Issues,SuperEmployees.Publishers,SuperEmployees.LastEdit,SuperEmployees.Sites

FROM SuperEmployees 

WHERE SuperEmployees.Issues Between 10 And 99999



RETURN

Notice this stored proc does not directly support paging.  You could take a paging information if that is required.

and to get a particular employee


ALTER PROCEDURE dbo.GetSuperEmployee

   (

   @EmployeeID int 

   )

AS

   SELECT  SuperEmployees.Name, SuperEmployees.EmployeeID,SuperEmployees.Gender,SuperEmployees.Origin,SuperEmployees.Issues,SuperEmployees.Publishers,SuperEmployees.LastEdit,SuperEmployees.Sites

FROM SuperEmployees 

WHERE SuperEmployees.EmployeeID = @EmployeeID



RETURN

Update:



ALTER PROCEDURE dbo.UpdateSuperEmployee

   (

   @EmployeeID int,

   @Name nvarchar(MAX),

   @Gender nvarchar(50),

   @Origin nvarchar(10),

   @Issues int,

   @Publishers nvarchar(10),

   @LastEdit datetime,

   @Sites nvarchar(MAX)

   )



AS

Update SuperEmployees

Set

 Name = @Name,

 Gender = @Gender,

 Origin = @Origin,

 Issues = @Issues,

 Publishers = @Publishers,

 LastEdit = @LastEdit,

 Sites = @Sites

Where 

 EmployeeID = @EmployeeID 

Insert:



ALTER PROCEDURE dbo.InsertSuperEmployee

   @Name nvarchar(MAX),

   @Gender nvarchar(50),

   @Origin nvarchar(10),

   @Issues int = 0,

   @Publishers nvarchar(10),

   @LastEdit datetime = null,

   @Sites nvarchar(MAX)

AS

Insert into SuperEmployees

(

 Name,

 Gender,

 Origin,

 Issues,

 Publishers,

 LastEdit,

 Sites

)

Values

(

 @Name,

 @Gender,

 @Origin,

 @Issues,

 @Publishers,

 @LastEdit,

 @Sites

 )

Select SCOPE_IDENTITY() as Id

And finally delete:



ALTER PROCEDURE dbo.DeleteSuperEmployee

   (

   @EmployeeID int 

   )



AS

Delete From

  SuperEmployees

  

Where 

  EmployeeID = @EmployeeID

3. Mise à jour du modèle Entity Framework

Maintenant, nous allons créer un modèle Entity Framework qui sait comment accéder aux données via ces procédures stockées. Commençons par créer un nouveau modèle Entity Framework.

Image non disponible

Ensuite, nous sélectionnons la table SuperEmployees et toutes les procédures que nous avons créées ci-dessus.

Image non disponible

Ensuite, je vais définir les propriétés de l'entité SuperEmployee, pour que la dénomination soit plus claire dans le monde. NET.

Image non disponible

Ensuite, nous allons associer les opérations CUD (create, update, delete) pour cette table, aux procédures stockées que nous venons d'écrire.

Nous allons d'abord faire correspondre la fonction Insérer à la procédure "InsertSuperEmployees"

Image non disponible

Visual Studio définit automatiquement la correspondance, si vous avez besoin d'ajuster cette opération en fonction de vos procédures stockées, vous pouvez le faire.

Image non disponible

Répétez cette opération pour Update et Delete, de façon à ce qu'elles soient toutes utilisées.

Image non disponible

Maintenant, nous devons faire la même chose pour les méthodes de sélection. Ouvrez l'Explorateur de modèles et de trouver la procédure stockée "CoolSuperEmployee". Faites un clic droit et sélectionnez "Créer la fonction d'importation".

Image non disponible

Ensuite, nous mettons en place une fonction qui va retourner des SuperEmployees.

Image non disponible

Et recommencez pour la procédure GetSuperEmployee (int employeeID)...

Maintenant que nous avons mis en place l'intégralité de notre modèle, revenons à notre DomainService et mettons-le à jour pour utiliser ces paramètres.

4. Mise à jour de DomainService

DomainService vous permet de créer une logique métier personnalisée et d'exposer facilement ces données pour le client Silverlight. La bonne nouvelle est que cela se passe presque exactement comme dans les exemples précédents.

Tout d'abord, penchons-nous sur les méthodes de requête.

 
Sélectionnez

[EnableClientAccess()]
public class SuperEmployeeDomainService :
    LinqToEntitiesDomainService<NORTHWNDEntities>
{       
    public IList<SuperEmployee> GetSuperEmployees()
    {
        var q = Context.CoolSuperEmployees();
        return q.ToList();
    }
    public SuperEmployee GetSuperEmployee(int employeeID)
    {
        return Context.GetSuperEmployee(employeeID).FirstOrDefault();
    }

Notez qu'à la cinquième ligne, nous retournons une IList plutôt qu'un IQueryable. Cela signifie que la composition de la requête du client s'effectue au niveau du retour de la procédure stocké, plutôt que dans la base de données.

C'est une bonne chose, car toutes nos requêtes vont passer au travers de cette procédure stockée, mais cela va entrainer le coût potentiel de ramener plus de données au niveau du serveur que ce dont le client a vraiment besoin.

Vous pouvez bien sûr ajouter de la pagination à la procédure stockée ou faire un accès direct à la table dans le cas d'une lecture, mais utilisez les procédures stockées pour Créer, Supprimer ou Modifier.

Ensuite, nous avons les procédures d'insertion et de mise à jour...

 
Sélectionnez
public void InsertSuperEmployee(SuperEmployee superEmployee)
{
    Context.AddToSuperEmployees(superEmployee);
}
public void UpdateSuperEmployee(SuperEmployee currentSuperEmployee)
{
    this.Context.AttachAsModified(currentSuperEmployee, this.ChangeSet.GetOriginal(currentSuperEmployee));
}

Notez que cela ressemble à notre exemple précédent, mais que maintenant ces méthodes font appel à nos procédures stockées au lieu d'accéder directement à la table.

Nous exécutons l'application, et elle fonctionne très bien ! Exactement comme les exemples précédents, mais cette fois tous les accès aux données se font via des procédures stockées.

Image non disponible

Pour plus d'informations sur comment utiliser des procédures stockées avec Entity Framework ou LinqToSql voir :

http://blogs.msdn.com/bags/archive/2009/03/12/entity-framework-modeling-action-stored-procedures.aspx ;
http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/12/17/ado-net-entity-framework-tools-stored-procedures.aspx ;
http://msdn.microsoft.com/en-us/library/bb384469.aspx.

5. Conclusion

Cet article conclut la partie sur l'utilisation des procédures stockées pour récupérer les données. La vingt-cinquième partie de cette série d'articles sera consacrée à l'approche ViewModel.

6. Remerciements

Je tiens ici à remercier Brad Abrams pour son aimable autorisation de traduire l'article.
Je remercie également ClaudeLELOUP pour sa relecture et ses propositions.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2011 VIALATTE, Philippe. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.