12.07.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!