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 =
@EmployeeID
III. 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.