Pourquoi avoir spécifié, modélisé et généré des entités métier ?

Si nous sommes à bord de Salamanca, c'est car nous voulons informatiser (et améliorer) l'un de nos processus de travail. L'objectif est de permettre aux acteurs de ce processus de consulter, saisir, évaluer, récupérer ou exploiter les ressources et informations alimentant ce processus dans le cadre d'un enchaînement d'activités.

C'est d'ailleurs la base de la définition d'une application métier :

"manipuler des données spécifiques à une organisation ou un secteur d'activité".

Nous sommes donc en accord avec la ligne de produits ciblée par l'usine Salamanca (ça tombe bien !). Pour cela, un moyen de stocker l'ensemble de ces informations nous est nécessaire.

Comme Salamanca comprend une bibliothèque ORM (mais pas seulement !), l'implémentation du mapping entre notre modèle d'entités métier et le modèle physique des données est pour nous, humble développeur "métier", transparent (même s'il est toujours conseillé d'avoir une compréhension haut niveau des concepts associés).

Nous nous attarderons donc lors de cette escale uniquement sur l'organisation que nous avons mis en place pour créer (et re-créer) rapidement notre base de données.

Organisation

Puisque nous disposons du code SQL généré pour la création des tables et des procédures stockées CRUD, autant en profiter. Néanmoins, leur emplacement dans le projet Model et leur liaison au fichier modèle (.tt) assurant leur génération ne permettent pas de les dinstinguer facilement dans notre solution Visual Studio. C'est pourquoi nous avons ajouté le projet Eproject.Sql de type Projet de base de données lors de la création de notre solution (tout s'explique !).

Ainsi, chaque développeur dispose de sa propre base de données de développement à partir d'un schéma placé dans le gestionnaire de versions (conformément aux bonnes pratiques) et "bien rangé" dans l'environnement de travail :

  • VS_SolutionExplorer_Sqlles scripts de création : dans Create Scripts
  • les scripts de mise à jour : dans Change Scripts

Pour cela, nous ajoutons dans les propriétés du projet Eproject.Model un évènement après génération (Post-build) afin de copier les fichiers SQL générés dans leur répertoire cible.

De cette façon, les scripts servant à la création de la base restent synchronisés après chaque mise à jour du modèle, puis compilation du code généré.

Remarque : la première fois, pensez à ajouter manuellement les fichiers copiés (clic droit sur le répertoire, puis "Ajouter un élément existant...").

Automatisation

Pour automatiser la création de notre base de données, nous avons besoin :

  • d'un script TRANSACT-SQL pour effacer (si nécessaire) et créer la base
  • d'exécuter l'utilitaire sqlcmd en ligne de commande ou dans un batch (.cmd)

Nous pourrions pousser l'automatisation de la même façon que pour la copie des fichiers SQL en ajoutant un évènement après génération du projet Eproject.Model. Mais cela efface les données saisies en cours de développement à chaque génération, donc nous préférons nous placer dans le répertoire Create Scripts et exécuter la commande ci-dessous (dans un batch) uniquement lors d'un changement dans notre schéma :

C:\eProject\src\ABordDeSalamanca\Eproject.Sql\Create Scripts>sqlcmd.exe -E -X -S .\SQLEXPRESS -v DatabaseName=eProject_ABord -i Create.sql

Comme nous utilisons une base de données SQL Server 2008 Express, notre exemple de script TRANSACT-SQL contient le code suivant :

USE master
GO

IF EXISTS (SELECT * FROM sys.databases WHERE name=N'$(DatabaseName)')
BEGIN
ALTER DATABASE $(DatabaseName)
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
DROP DATABASE $(DatabaseName)
END
GO

CREATE DATABASE $(DatabaseName)
GO

USE $(DatabaseName)
GO

:reset
:r Tables.sql
:r StoredProcedures.sql
GO

Voilà une façon rapide de disposer à tout moment d'une base de données synchronisée avec notre modèle d'entités métier. Et nous verrons lors de notre prochaine escale comment la mise en place de notre projet de tests unitaires en bénéficie...