I. 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.
II. 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 ».

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 :
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 = @EmployeeIDIII. 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.

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

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.

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 »
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.

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

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 ».

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

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.
IV. 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.
[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…
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.

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.
V. 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.
VI. 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.






