Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
l’ancienne valeur dans chaque relation à laquelle elle participe. Notons également que les mises à<br />
jour sont les seules opérations pouvant être invisibles au programmeur inattentif. Dans le cadre<br />
d’une relation entre entités, s’il l’un <strong>de</strong>s participants est supprimé l’autre subira une mise à jour pour<br />
refléter que cette relation n’existe plus [4] [11]. Cette mise à jour n’aura éventuellement pas été<br />
spécifiée explicitement. De même, lorsqu’une association est créée en passant à une entité une<br />
référence vers une autre entité, l’entité reliée (mais non modifiée explicitement) sera mise à jour.<br />
Ajouter ou modifier une entité du DataContext n’est en soi que la moitié du travail. Les entités en<br />
mémoire ne sont plus synchronisées par rapport à la base <strong>de</strong> données et les modifications désirées<br />
n’y seront pas encore effectives [1]. Pour notifier le DataContext qu’une mise à jour est souhaitée, il<br />
faut le faire explicitement par le biais <strong>de</strong> la métho<strong>de</strong> SubmitChanges. Cette opération va prendre en<br />
charge toutes les modifications apportées aux entités, qu’il s’agisse <strong>de</strong> créations, <strong>de</strong> mises à jour ou<br />
<strong>de</strong> suppressions. C’est lors <strong>de</strong> l’appel <strong>de</strong> cette métho<strong>de</strong> que le service sentinelle va répertorier toutes<br />
les modifications apportées aux entités. Des instructions Sql vont ensuite être générées pour amener<br />
la base <strong>de</strong> données correspondant aux entités en mémoire. Ceci a plusieurs implications en termes<br />
<strong>de</strong> performances et d’ordonnancement <strong>de</strong>s opérations. Premièrement, chaque appel <strong>de</strong> la métho<strong>de</strong><br />
SubmitChanges peut potentiellement donner lieu à <strong>de</strong>s opérations inattendues à cet instant précis<br />
[4]. En effet, la sentinelle enregistre toutes les modifications et il est tout à fait possible qu’une autre<br />
partie du programme ait créé <strong>de</strong>s modifications entre une insertion et sa soumission quelques lignes<br />
plus loin. Dans un contexte multithreads ou dans celui d’une programmation par événements,<br />
l’enchaînement exact <strong>de</strong> chaque instruction est au mieux dur à prévoir. Les mises à jour implicites<br />
sont également à ranger dans cette catégorie d’opérations fantômes. Deuxième remarque à<br />
soulever, le service sentinelle passe en revue chaque entité en mémoire à chaque appel <strong>de</strong> cette<br />
fameuse métho<strong>de</strong>. La seule opération effectuée sur une entité non modifiée consiste à tester si son<br />
marquage est toujours égal à « non modifiée ». Pour un ensemble conséquent d’entités, ceci peut<br />
créer un délai non désiré dont il faut rester conscient. Il est, par exemple, conseillé d’éviter d’appeler<br />
SubmitChanges dans une boucle <strong>de</strong>stinée à créer un ensemble d’objets.<br />
4.2.3 Cas pratiques<br />
Il nous reste maintenant à découvrir les techniques pratiques pour construire un mapping et son<br />
DataContext associé. Nous allons ensuite soumettre quelques requêtes et observer comment nous<br />
parviennent les résultats. Nous envisagerons d’abord un cas très simple à vocation illustrative avant<br />
<strong>de</strong> considérer <strong>de</strong>s scénarios plus complexes.<br />
Supposons que nous ayons une base <strong>de</strong> données Sql Server 2008 pleinement fonctionnelle à notre<br />
disposition et que notre application ne souhaite pas prendre en charge les accès concurrentiels pour<br />
l’instant. Nous allons réaliser tout cela avec Visual Studio 2008, étape par étape.<br />
En ayant créé un nouveau projet C#, nous allons ouvrir l’explorateur <strong>de</strong> serveurs pour y localiser<br />
notre base <strong>de</strong> données. Lorsque nous l’avons trouvée, nous pouvons désormais voir les tables qu’elle<br />
contient, ses procédures stockées, ses fonctions utilisateurs, les associations entre les tables et <strong>de</strong><br />
nombreuses autres informations dont nous ne ferons pas usage dans ce simple petit test. Ajoutons<br />
une classe à notre projet dont le type sera « <strong>Linq</strong> to Sql class ». Les classes <strong>Linq</strong> to Sql arborent<br />
l’extension Dbml, aussi nous pouvons en conclure qu’il s’agira <strong>de</strong> notre fichier <strong>de</strong> mapping.<br />
Choisissons lui un nom <strong>de</strong> circonstance (par exemple « MonMapping ») et validons notre choix afin<br />
<strong>de</strong> créer ce fameux fichier <strong>de</strong> mapping. Rappelons que la structure d’un tel fichier, vue à la section