<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Hinault Romaric Donfack &#187; Entity Framework</title>
	<atom:link href="https://blog.developpez.com/lilroma/pcategory/net/entity-framework/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/lilroma</link>
	<description>Bienvenue sur ce blog. Vous y trouverez du .NET, du .NET...  encore du .NET, toujours du .NET et très peu de chose sur moi</description>
	<lastBuildDate>Sat, 27 Aug 2016 14:24:30 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Entity Framework : que faire face à l’erreur «new transaction is not allowed because there are other threads running »</title>
		<link>https://blog.developpez.com/lilroma/p11182/net/entity_framework_que_faire_face_a_l_erre</link>
		<comments>https://blog.developpez.com/lilroma/p11182/net/entity_framework_que_faire_face_a_l_erre#comments</comments>
		<pubDate>Fri, 27 Jul 2012 16:58:48 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je travaillais il y a de cela quelques jours sur une application ASP.NET MVC 3, avec l’ORM Entity Framework. J’ai été confronté lors de l’écriture de mon code à l’erreur suivante : «new transaction is not allowed because there are &#8230; <a href="https://blog.developpez.com/lilroma/p11182/net/entity_framework_que_faire_face_a_l_erre">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je travaillais il y a de cela quelques jours sur une application ASP.NET MVC 3, avec l’ORM Entity Framework. J’ai été confronté lors de l’écriture de mon code à l’erreur suivante : «new transaction is not allowed because there are other threads running ». </p>
<p>Comme il n’est pas exclu que je tombe encore sur le même type de problème à l’avenir, je vais partager sur mon blog  &#8211; qui est avant tout mon rappel mémoire favori &#8211; les causes de cette erreur et comment contourner cela.</p>
<p><span id="more-83"></span></p>
<p><strong>Ce que j’essayais de faire dans mon application.</strong></p>
<p>Pour une facture, je voulais récupérer la liste des produits, et pour chaque produit, avoir  la fiche produit correspondante, y effectuer des modifications, ensuite appliquer la mise à jour à la base de données.</p>
<p>Le code source de cette partie est le suivant :</p>
<p>&#160;</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">var lp = from l <span style="color: #0000ff">in</span> db.Liste_produit.Include(l =&gt; l.Article)<br />         <span style="color: #0000ff">where</span> l.Id_facture == facture.Id_facture<br />         select l;<br /><span style="color: #0000ff">foreach</span>(Liste_produit liste_produit <span style="color: #0000ff">in</span> lp)<br />     {<br />       article = liste_produit.Article;<br />       <span style="color: #008000">//bla bla bla</span><br />       <span style="color: #008000">//bla bla bla</span><br />       db.Entry(article).State = EntityState.Modified;<br />       db.SaveChanges();<br />                        <br />     }<br /></pre>
<p></div>
<p>À l’exécution de ce code, au moment de l’enregistrement des modifications dans la base de données (db.SaveChanges()), l’exception ci-dessous est levée.</p>
<p><img src="http://blog.developpez.com/media/exception.png" width="580" height="317" alt="" /></p>
<p><strong>Les causes :</strong></p>
<p>Après avoir observé le problème de près et effectué quelques recherches, je me suis rendu compte que le souci était au niveau du foreach.</p>
<p>Il semblerait que pour la lecture de chaque élément dans « lp », la bouche ait recours à une transaction pour le Context en cours. Hor, lorsque j’appelle la procédure SaveChanges(), une nouvelle transaction veut être créée pour le même Context. Ce qui n’est pas autorisé par Entity Famework.</p>
<p><strong>Solutions</strong></p>
<p>De prime abord, j’ai opté pour la sauvegarde de mes données dans une IList. Ainsi, lors de la lecture de celles-ci, je n’aurais plus besoin d’avoir recours à une transaction.<br />
Le code que j’ai utilisé est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 400px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">var lp = from l <span style="color: #0000ff;">in</span> db.Liste_produit.Include(l =&gt; l.Article)<br />         <span style="color: #0000ff;">where</span> l.Id_facture == fa.Id_facture<br />         select l;<br />IList&lt;Liste_produit&gt; ListeP = lp.ToList();<br /><span style="color: #0000ff;">foreach</span>(Liste_produit liste_produit <span style="color: #0000ff;">in</span> ListeP)<br />   {<br />      article = liste_produit.Article;<br />      <span style="color: #008000;">//bla bla bla</span><br />      <span style="color: #008000;">//bla bla bla</span><br />      db.Entry(article).State = EntityState.Modified;<br />      db.SaveChanges();<br />                        <br />  }<br /></pre>
<p></div>
<p>Cette solution marche. Mais, côté performance, elle n’est pas du tout satisfaisante. Si la quantité de données est importante, imaginez un peu la consommation de la mémoire en chargeant toutes ces données dans une liste.</p>
<p>En tout cas, elle ne m’arrange pas.  J’ai donc opté pour une solution beaucoup plus simple et performante. J’ai simplement appelé la procédure SaveChanges() en dehors de la boucle et le problème a été résolu avec de meilleures performances.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 400px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">var lp = from l <span style="color: #0000ff;">in</span> db.Liste_produit.Include(l =&gt; l.Article)<br />         <span style="color: #0000ff;">where</span> l.Id_facture == facture.Id_facture<br />         select l;<br /><span style="color: #0000ff;">foreach</span>(Liste_produit liste_produit <span style="color: #0000ff;">in</span> lp)<br />   {<br />      article = liste_produit.Article;<br />      <span style="color: #008000;">//bla bla bla</span><br />      <span style="color: #008000;">//bla bla bla</span><br />      db.Entry(article).State = EntityState.Modified;<br />   }<br />db.SaveChanges();<br /></pre>
<p></div>
<p>En procédant ainsi, j’apporte des modifications à l’entité dans le foreach, et c’est à la suite de cette instruction (lorsque la transaction a été bouclée) que j’appelle la procédure SaveChanges().</p>
<p>Voila le problème est résolu, et la prochaine fois que je serais face à ce problème (ce qui est fort probable), et que je ne me souviendrais plus de comment j’avais procédé (ce qui est également fort probable), je saurais ou chercher e premier ;).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Entity Framework devient Open Source</title>
		<link>https://blog.developpez.com/lilroma/p11173/net/entity_framework_devient_open_source</link>
		<comments>https://blog.developpez.com/lilroma/p11173/net/entity_framework_devient_open_source#comments</comments>
		<pubDate>Mon, 23 Jul 2012 17:07:23 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Entity Framework, l’ORM (object-relational mapping) qui est en passe de devenir un standard pour l’accès aux données sur la plateforme .NET vient d’être passé en open source. Scott Guthrie, Vice-président de la division serveur et Business Tools chez Microsoft, a &#8230; <a href="https://blog.developpez.com/lilroma/p11173/net/entity_framework_devient_open_source">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Entity Framework, l’ORM (object-relational mapping) qui est en passe de devenir un standard pour l’accès aux données sur la plateforme .NET vient d’être passé en open source.</p>
<p><img src="http://rdonfack.developpez.com/images/entityframework.PNG" alt="" title="" /></p>
<p>Scott Guthrie, Vice-président de la division serveur et Business Tools chez Microsoft, a annoncé que l’outil sera désormais disponible sous les termes de la licence Apache 2.0, et son code source sera disponible sur CodePlex, la plateforme d’hébergement des projets .NET Open Source.</p>
<p>Le passage en open source d’Entity Framework se situe dans le plan d’ouverture adopté par Microsoft depuis un certain moment avec la création de sa filiale Microsoft Open Technology.</p>
<p>L’ouverture d’Entity Framework permettra une plus grande transparence de développement avec un modèle ouvert où toute la communauté sera en mesure de fournir une rétroaction, des correctifs de bugs, de nouvelles fonctionnalités, etc.</p>
<p>Entity Framework sera toujours pris en charge comme un produit Microsoft et son équipe restera inchangée. Le produit disposera également des mêmes mécanismes de support technique, et sera publié de façon automne ou comme partie de Visual Studio.</p>
<p>Entity Framework est actuellement disponible en version 4.3, et apporte comme nouveauté phare Code First Migrations. La version 5 actuellement au stade de Release Candidate, sera publiée au même moment que le Framework .NET 4.5, et introduira comme nouveauté le support pour enum, des types de données spatiales, etc.</p>
<p>&#8211; <strong><a href="http://entityframework.codeplex.com/">Entity Framework sur CodePlex</a></strong></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Article]Entity Framework : à la découverte de Code First Migrations</title>
		<link>https://blog.developpez.com/lilroma/p11158/net/article_entity_framework_a_la_decouverte</link>
		<comments>https://blog.developpez.com/lilroma/p11158/net/article_entity_framework_a_la_decouverte#comments</comments>
		<pubDate>Wed, 18 Jul 2012 09:30:59 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un petit post pour annoncé la publication de nouvel article sur Code First Migrations, la nouveauté certainement la plus intéressante d&#8217;Entity Framework 4.3. Pendant le développement ou le cycle de vie d&#8217;une application, le développeur est très souvent confronté à &#8230; <a href="https://blog.developpez.com/lilroma/p11158/net/article_entity_framework_a_la_decouverte">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Un petit post pour annoncé la publication de nouvel article sur Code First Migrations, la nouveauté certainement la plus intéressante d&rsquo;Entity Framework 4.3.</p>
<blockquote><p>Pendant le développement ou le cycle de vie d&rsquo;une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet ainsi que de sa base de données. Avec Entity Framework, cette tâche peut s&rsquo;avérer assez complexe, voire frustrante pour certains.</p>
<p>Si vous voulez par exemple apporter une modification (ajout d&rsquo;une colonne) à une table de votre base de données, si vous vous limitez à définir uniquement la nouvelle colonne dans votre modèle, lors de l&rsquo;exécution de l&rsquo;application vous allez obtenir un message d&rsquo;erreur puisque le modèle ne correspond plus aux objets de la BD.</p>
<p>Il était cependant possible d&rsquo;ajouter quelques lignes de code dans le fichier Global.asax, permettant lors de la modification du modèle, de détruire et recréer automatiquement la base de données lors de la prochaine exécution de l&rsquo;application, avec comme conséquence directe la perte des données. Ce qui est inacceptable pour une base de données déjà en production.</p>
<p>Heureusement, Entity Framework 4.3 élimine ces contraintes avec la nouvelle fonctionnalité Code First Migrations, qui permet d&rsquo;appliquer avec souplesse les modifications du modèle sur la base de données, en réduisant les risques de pertes de données.</p></blockquote>
<p>L&rsquo;article complet est <a href="http://rdonfack.developpez.com/tutoriels/dotnet/entity-framework-decouverte-code-first-migrations/">disponible ici</a>.</p>
<p>Pour les commentaires, <a href="http://www.developpez.net/forums/d1243827/dotnet/acces-aux-donnees/entity-framework/entity-framework-decouverte-code-first-migrations/">ça se passe ici</a></p>
<p><strong>Bonne lecture</strong> <img src="https://blog.developpez.com/lilroma/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC et Entity Framework : résoudre l’erreur  System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types</title>
		<link>https://blog.developpez.com/lilroma/p11148/net/asp_net_mvc_et_entity_framework_resoudre</link>
		<comments>https://blog.developpez.com/lilroma/p11148/net/asp_net_mvc_et_entity_framework_resoudre#comments</comments>
		<pubDate>Fri, 13 Jul 2012 10:22:03 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lors du déploiement de mon application ASP.NET MVC 3 chez un client, j’ai eu l’erreur « System.Reflection.ReflectionTypeLoadException » pendant l’exécution de celle-ci. Pourtant, l’application fonctionnait correctement sur ma machine de développement. En dehors d’un foutu message “Unable to load one &#8230; <a href="https://blog.developpez.com/lilroma/p11148/net/asp_net_mvc_et_entity_framework_resoudre">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Lors du déploiement de mon application ASP.NET MVC 3 chez un client, j’ai eu l’erreur « System.Reflection.ReflectionTypeLoadException » pendant l’exécution de celle-ci. Pourtant, l’application fonctionnait correctement sur ma machine de développement.</p>
<p>En dehors d’un foutu message “Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information”, rien ne permet d’identifier clairement la source de cette erreur.</p>
<p><span id="more-43"></span></p>
<p>Après plusieurs recherches, il semblerait que l’erreur soit générée par Entity Framework. En effet, lorsque vous utilisez Entity Framework, celui-ci est configuré par défaut pour charger tous les types des assemblys référencées, afin d’identifier les différents types des entités pour votre modèle objet.  Si l’un des types ne peut être chargé, alors Entity Framework va générer cette erreur.</p>
<p>Il existe plusieurs solutions pour fixer ce problème :</p>
<p>&#8211; vous pouvez marquer la copie locale de toutes les assemblys référencées dans votre application à True ;</p>
<p>&#8211; dans une autre mesure, il suffit de supprimer toutes les DLL dans le dossier bin et procéder à une nouvelle génération de votre application.</p>
<p>&#8211; il est également possible que les bibliothèques System.Data.Entity et System.Web.Entity soient corrompues.  Pour mon cas par exemple, lors du déploiement de mon application, après investigation, je me suis rendu compte que les fichiers System.Data.Entity.dll et System.Web.Entity.dll avaient respectivement pour tailles 1640 Ko et 63 ko, pourtant dans le framework .NET, ces fichiers avaient pour tailles 4360 Ko et 135 Ko. En les remplaçant simplement avant le déploiement de l’application, cela a résolu ce bug.</p>
<p>Mais, le véritable problème ici, c’est d’identifier réellement l’assemblys qui pose problème. Pour cela, vous  pouvez simplement utiliser le code suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 600px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">try</span><br />{<br />    <span style="color: #008000">//Le code qui pose problème.</span><br />}<br /><span style="color: #0000ff">catch</span> (ReflectionTypeLoadException ex)<br />{<br />    StringBuilder sb = <span style="color: #0000ff">new</span> StringBuilder();<br />    <span style="color: #0000ff">foreach</span> (Exception exSub <span style="color: #0000ff">in</span> ex.LoaderExceptions)<br />    {<br />        sb.AppendLine(exSub.Message);<br />        <span style="color: #0000ff">if</span> (exSub <span style="color: #0000ff">is</span> FileNotFoundException)<br />        {<br />            FileNotFoundException exFileNotFound = exSub <span style="color: #0000ff">as</span> FileNotFoundException;<br />            <span style="color: #0000ff">if</span>(!<span style="color: #0000ff">string</span>.IsNullOrEmpty(exFileNotFound.FusionLog))<br />            {<br />                sb.AppendLine(<span style="color: #006080">&quot;Fusion Log:&quot;</span>);<br />                sb.AppendLine(exFileNotFound.FusionLog);<br />            }<br />        }<br />        sb.AppendLine();<br />    }<br />    <span style="color: #0000ff">string</span> errorMessage = sb.ToString();<br />   }<br /></pre>
<p></div>
<p>N’oubliez pas d’ajouter une référence à System.IO et System.Reflection;</p>
<p>Et voilà. Dorénavant, lorsque vous allez exécuter votre application et qu’il y’aura un problème avec le chargement d’un composant, vous aurez un message clair et les détails sur l’assembly qui pose problème.</p>
<p>À noter que ce bug n’existe plus lorsque l’on utilise Entity Framework avec le framework .NET 4.5, il ne scanne plus toutes les assemblys de l’application lors de son exécution.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Entity Framework Code First : activer la migration automatique</title>
		<link>https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m</link>
		<comments>https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m#comments</comments>
		<pubDate>Sat, 16 Jun 2012 10:35:58 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pendant le développement ou le cycle de vie d’une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet et de la base de données. Avec Entity Framework, cette tâche peut s’avérer &#8230; <a href="https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pendant le développement ou le cycle de vie d’une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet et de la base de données. Avec Entity Framework, cette tâche peut s’avérer assez complexe et voir même frustrant pour certains.</p>
<p>Une des nouveautés les plus intéressantes qu’apporte Entity Framework 4.3 est la migration pour les mises à jour de la base de données.</p>
<p>Cette fonctionnalité offre aux développeurs des outils permettant d’appliquer avec souplesse et facilité des mises à jour à la base de données à partir des modifications apportées à l’application. </p>
<p><span id="more-80"></span></p>
<p>Dans <a href="http://blog.developpez.com/lilroma/p10807/">un précédent billet de blog</a>, j’ai présenté cette fonctionnalité et comment l’on pouvait l’utiliser pour effectuer des mises à jour de la base de données.</p>
<p>Cet article présentait uniquement l’un des modes de mises à jour qu’offre Entity Framework : le mode basé sur le code.</p>
<p>Supposons que vous disposez déjà d’une application utilisant Entity Framework Code First. Procédez à la mise à jour de celle-ci pour utiliser la version 4.3 d’Entity Framework si ce n’est pas encore le cas.</p>
<p>Vous pouvez utiliser la commande :</p>
<blockquote><p>PM>  install-package EntityFramework
</p></blockquote>
<p><strong>Activer la migration</strong></p>
<p>La première étape est d’activer la migration pour votre DbContext, en utilisant la console du gestionnaire de packages (menu Outils/Gestionnaire de package/Package Manager Console de Visual Studio). Vous allez exécuter la commande «  Enabled-Migrations ».</p>
<p><img src="http://blog.developpez.com/media/enablemigration.png" alt="" title="" /></p>
<p>L’activation de la migration crée un nouveau dossier Migrations dans votre application contenant un fichier Configurations.cs permettant de définir le comportement de la migration pour le DbContext qui est utilisé.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">namespace</span> DatabaseMigration.Migrations<br />{<br />    <span style="color: #0000ff">using</span> System;<br />    <span style="color: #0000ff">using</span> System.Data.Entity;<br />    <span style="color: #0000ff">using</span> System.Data.Entity.Migrations;<br />    <span style="color: #0000ff">using</span> System.Linq;<br /><br />    <span style="color: #0000ff">internal</span> <span style="color: #0000ff">sealed</span> <span style="color: #0000ff">class</span> Configuration : DbMigrationsConfiguration&lt;DatabaseMigration.DatabaseMigrationContext&gt;<br />    {<br />        <span style="color: #0000ff">public</span> Configuration()<br />        {<br />            AutomaticMigrationsEnabled = <span style="color: #0000ff">false</span>;<br />        }<br /><br />        <span style="color: #0000ff">protected</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> Seed(DatabaseMigration.DatabaseMigrationContext context)<br />        {<br />            <br />        }<br />    }<br />}<br /></pre>
<p></div>
<p>Si vous avez défini plusieurs «DbContext » dans votre application, il suffira juste de modifier  DbMigrationsConfiguration(T), en remplaçant T par le nom du DbContext que vous voulez utiliser.</p>
<p><strong>Configurer la migration automatique</strong></p>
<p>Par défaut, la propriété AutomaticMigrationsEnabled est définie à false. Pour utiliser la migration automatique, vous devez affecter la valeur « true » à cette propriété.</p>
<p>Il également possible de définir cette propriété à true lors de l’activation de la migration. Pour cela, vous devez ajouter le paramètre EnableAutomaticMigrations à la commande permettant d’activer la migration :</p>
<blockquote><p>PM> Enable-Migrations -EnableAutomaticMigrations</p></blockquote>
<p>Par défaut, la migration automatique n’autorise pas les mises à jour pouvant entrainer des pertes de données. Pour activer cette option, vous devez éditer le fichier Configuration.cs en y ajoutant la propriété  « AutomaticMigrationDataLossAllowed » qui sera définie à true.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> Configuration()<br />        {<br />            AutomaticMigrationsEnabled = <span style="color: #0000ff;">true</span>;<br />            AutomaticMigrationDataLossAllowed = <span style="color: #0000ff;">true</span>;<br />        }</pre>
<p></div>
<p>Editez ensuite votre DbContext et ajoutez-y la procédure onModelCreating  :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> OnModelCreating(DbModelBuilder modelBuilder)<br />        {<br />            Database.SetInitializer(<span style="color: #0000ff;">new</span> MigrateDatabaseToLatestVersion&lt;DatabaseMigrationContext, Configuration&gt;());<br />        }</pre>
<p></div>
<p>Et voilà, c’est tout ;). Toute modification de votre modèle objet (nouvelle entité, ajout d’une propriété, suppression d’une propriété, etc.) sera automatiquement appliquée à la base de données à l’exécution de votre application.</p>
<p><strong>Inconvénients de la migration automatique</strong></p>
<p>La migration automatique permet d’apporter assez rapidement et simplement des mises à jour à une base de données en utilisant Entity Framework Code First. Cette option présente cependant des inconvénients, et personnellement, je ne recommanderais pas son utilise en environnement de production ou sur un système critique.</p>
<p>L’utilisation du mode automatique en environnement de production peut s’avérer assez dangereuse, avec un risque de perte de données, car les modifications apportées à la base de données sont imprévisibles par le développeur, et celui-ci n’a aucune visibilité sur ces changements.</p>
<p>Néanmoins, vous pouvez limiter ces risques en environnement de production en désactivant l’autorisation des mises à jour pouvant entrainer des pertes de données.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Tutoriel]Création d’une application CRUD avec WebMatrix, Razor et Entity Framework</title>
		<link>https://blog.developpez.com/lilroma/p11023/net/tutoriel_creation_d_une_application_crud</link>
		<comments>https://blog.developpez.com/lilroma/p11023/net/tutoriel_creation_d_une_application_crud#comments</comments>
		<pubDate>Mon, 14 May 2012 10:00:56 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Salut, Les cinq articles de blog qui présentaient pas à pas comment créer une application CRUD avec WebMatrix, Razor et Entity Framework ont été regroupés en un seul tutoriel qui vient d’être publié sur Developpez.com. J&#8217;ai eu à développer récemment &#8230; <a href="https://blog.developpez.com/lilroma/p11023/net/tutoriel_creation_d_une_application_crud">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Salut,</p>
<p> Les cinq articles de blog qui présentaient pas à pas comment créer une application CRUD avec WebMatrix, Razor et Entity Framework ont été regroupés en un seul tutoriel qui vient d’être publié sur Developpez.com.</p>
<blockquote><p>J&rsquo;ai eu à développer récemment une application CRUD avec WebMatrix. Utilisant principalement la classe DataBase de l&rsquo;espace de nom Microsoft.Data pour la manipulation des données, lorsque j&rsquo;ai aperçu Entity Framework dans les packages NuGet avec WebMatrix 2 bêta, je me suis dit &laquo;&nbsp;génial&nbsp;&raquo; ! Ça veut dire que je peux l&rsquo;utiliser dans ma solution.</p>
<p>J&rsquo;ai donc opté pour l&rsquo;utilisation de la bibliothèque au sein de mon application WebMatrix. Entity Framework est en passe de devenir un standard pour la manipulation des données et est recommandé par Microsoft.</p>
<p>Contrairement à Visual Studio et ASP.NET ou l&rsquo;on dispose de plusieurs outils rendant facile la conception d&rsquo;une application CRUD avec Entity Framework, sur WebMatrix, c&rsquo;est un peu compliqué et l&rsquo;on ne dispose pas des fonctionnalités comme l&rsquo;échafaudage, et encore moins des ressources sur Internet.</p>
<p>C&rsquo;est pourquoi j&rsquo;ai décidé de fournir au travers de cet article une démarche pas à pas avec autant de détails que possible pour la conception d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p>Le lecteur, tout au long de ce tutoriel, pourra se familiariser avec WebMatrix, Razor, Entity Framework, le gestionnaire de packages open source .NET NuGet pour WebMatrix et le gestionnaire de base de données SQL Server Compact Edition.</p>
<p>Cet article est essentiellement destiné aux débutants. Aucun prérequis n&rsquo;est donc nécessaire pour sa bonne compréhension. Il est néanmoins préférable d&rsquo;avoir des connaissances de base en programmation orientée objet avec C# et d&rsquo;être familiarisé avec WebMatrix et Razor. Si ce n&rsquo;est pas le cas, je vous conseille de lire dans un premier temps mon tutoriel de présentation de WebMatrix, ainsi que mon tutoriel sur Razor.</p></blockquote>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/">Consulter le tutoriel complet</a></p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/webmatrixcrudapp.pdf">Télécharger la version PDF</a></p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/webmatrixcrudapp.zip">Télécharger la version hors-ligne</a></p>
<p> &#8211; <a href="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/webmatrixcrudapp-ebooks.zip">Télécharger la version eBook</a></p>
<p> &#8211; Télécharger le code source de l&rsquo;application d&rsquo;exemple :</p>
<p>          . <img src="http://www.developpez.be/images/kitsrc.jpg" alt="" title="" /> <a href="ftp://ftp-developpez.com/rdonfack/WebMatrixCrudApp.rar">Version RAR</a></p>
<p>          . <img src="http://www.developpez.be/images/kitsrc.jpg" alt="" title="" /> <a href="ftp://ftp-developpez.com/rdonfack/WebMatrixCrudApp.zip">Version ZIP</a></p>
<p>&#8211; <a href="http://www.developpez.net/forums/showthread.php?t=1214877">Pour les commentaires c&rsquo;est par ici </a></p>
<p><strong>Bonne lecture</strong> <img src="https://blog.developpez.com/lilroma/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 3 : création du DBContext et du Repository</title>
		<link>https://blog.developpez.com/lilroma/p10896/net/creation_d_une_application_crud_avec_web_2</link>
		<comments>https://blog.developpez.com/lilroma/p10896/net/creation_d_une_application_crud_avec_web_2#comments</comments>
		<pubDate>Sat, 31 Mar 2012 10:33:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&#8217;une application CRUD avec WebMatrix, Razor et Entity Framework. &#8211; Part 1 : introduction et présentation des outils &#8211; Part 2 : création de l&#8217;application &#8230; <a href="https://blog.developpez.com/lilroma/p10896/net/creation_d_une_application_crud_avec_web_2">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p> &#8211; Part 1 : <a href="http://blog.developpez.com/lilroma/p10870/">introduction et présentation des outils</a></p>
<p> &#8211; Part 2 : <a href="http://blog.developpez.com/lilroma/p10876/">création de l&rsquo;application et définition du modèle objet</a></p>
<p>Dans les parties précédentes, nous nous sommes familiarisés avec les outils que nous allons utiliser, et nous avons par la suite procédé à la création de l’application et à la définition du modèle objet qui sera utilisé.</p>
<p>Cette partie portera sur la création du DbContext, la définition de la chaine de connexion dans le fichier Web.Config, la création de la base de données à partir du modèle objet et afin la définition du Repository qui sera utilisé.</p>
<p><span id="more-55"></span></p>
<p><strong>Création du DBContex</strong></p>
<p>Nous allons maintenant créer la classe qui va s’occuper de gérer la communication entre les classes entités et la base de données.  Cette classe va hériter de la classe DbContext.</p>
<p>La classe DbContext expose les fonctionnalités les plus couramment utilisées pour interroger et puis utiliser les données d’entité en tant qu’objet.</p>
<p>Vous allez ajouter au dossier App_Code un nouveau fichier de classe  ayant pour nom « WebMatrixCrudApp.Context.cs ».</p>
<p>Dans ce fichier, vous allez ajouter une nouvelle classe « WebMatrixCrudAppContext » qui hérite de DbContext.</p>
<p>Cette classe doit contenir trois attributs DbSet fortement typés correspondants à vos différentes entités.  Les attributs DbSet vont permettre de gérer la correspondance avec les tables de la base de données.</p>
<p>Dans ce fichier, vous aurez le code suivant :</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">using</span> System;<br /><span style="color: #0000ff">using</span> System.Data.Entity;<br /><br /><span style="color: #008000">/// &lt;summary&gt;</span><br /><span style="color: #008000">/// Summary description for ClassName</span><br /><span style="color: #008000">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> WebMatrixCrudAppContext : DbContext <br />{<br />    <span style="color: #0000ff">public</span> DbSet&lt;Personne&gt; Personnes { get; set; }<br />    <span style="color: #0000ff">public</span> DbSet&lt;Organisme&gt; Organismes {get; set; }<br />    <span style="color: #0000ff">public</span> DbSet&lt;Affiliation&gt; Affiliations {get; set; }<br />    <br />}<br /></pre>
<p></div>
<p>La prochaine étape sera l’ajout de la chaine de connexion pour le mode Code First d’Entity Framework dans le fichier Web.config.</p>
<p>Pour cela, doublez cliquez sur le fichier Web.config dans l’explorateur de solution et ajoutez les lignes de code suivantes à celui-ci :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">connectionStrings&gt;<br />        &lt;add name=<span style="color: #006080;">"WebMatrixCrudAppContext"</span> connectionString=<span style="color: #006080;">"Data Source=|DataDirectory|WebMatrixCrudApp.sdf"</span> <br />             providerName=<span style="color: #006080;">"System.Data.SqlServerCe.4.0"</span> /&gt;<br />    &lt;/connectionStrings&gt;</pre>
<p></div>
<p>Le nom de la chaîne de connexion doit être celui de votre classe DbContext (WebMatrixCrudAppContext) </p>
<p>Le fichier XML de configuration de votre application doit ressembler à ceci :</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">&lt;?xml version=<span style="color: #006080">&quot;1.0&quot;</span> encoding=<span style="color: #006080">&quot;utf-8&quot;</span>?&gt;<br />&lt;configuration&gt;<br />  &lt;system.web&gt;<br />    &lt;compilation&gt;<br />      &lt;assemblies&gt;<br />        &lt;add assembly=<span style="color: #006080">&quot;System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</span> /&gt;<br />      &lt;add assembly=<span style="color: #006080">&quot;System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot;</span> /&gt;&lt;/assemblies&gt;<br />    &lt;/compilation&gt;<br />  &lt;/system.web&gt;<br />    &lt;connectionStrings&gt;<br />        &lt;add name=<span style="color: #006080">&quot;WebMatrixCrudAppContext&quot;</span> connectionString=<span style="color: #006080">&quot;Data Source=|DataDirectory|WebMatrixCrudApp.sdf&quot;</span> <br />             providerName=<span style="color: #006080">&quot;System.Data.SqlServerCe.4.0&quot;</span> /&gt;<br />    &lt;/connectionStrings&gt;<br />&lt;/configuration&gt;<br /></pre>
<p></div>
<p>Procédez à l’exécution de votre application en cliquant sur le bouton « Run » et sélectionnez le navigateur de votre choix dans la boite d’outils.</p>
<p>La base de données SQL Server Compact « WebMatrixCrudApp.sdf » sera automatiquement créée dans le dossier App_data de votre application.</p>
<p>En sélectionnant l’espace de données Databases, vous pouvez constater qu’une nouvelle base de données a été ajoutée à votre application. </p>
<p><img src="http://blog.developpez.com/media/createdatabase.PNG" width="827" height="549" alt="" /></p>
<p>En observant cette base de données, vous vous  rendez compte que les tables qui ont été créées correspondent aux propriétés DbSet de la  classe WebMatrixCrudAppContext.<br />
On remarque également que la taille des colonnes Nom et Prenom par exemple de la table Personnes  est la même que celle que vous avez défini dans la classe Personne avec l’attribut [MaxLengthAttribute(50)]</p>
<p>En sélectionnant la table Affiliations et en cliquant sur la commande View de la zone Relationships, vous constatez également que les relations de clés étrangères qui ont été définies pour la classe Affiliation ont été créées.</p>
<p><img src="http://blog.developpez.com/media/RelationShips.PNG" width="826" height="548" alt="" /></p>
<p>En cliquant par exemple sur la relation Affiliation_Organisme, vous obtenez le résultat suivant :</p>
<p><img src="http://blog.developpez.com/media/CreateNewRelation.PNG" width="486" height="439" alt="" /></p>
<p>Une table supplémentaire EdmMataData a été ajoutée dans votre base de données. Cette table permet à Entity Framework Code First de savoir si le modèle utilisé pour créer une base de données est le même que celui qui est utilisé pour accéder à cette base de données (avec la version 4.3 d’EF cette table n’est plus créée).</p>
<p>Dans le cas au vous apportez des modifications à votre modèle objet,  lors de l’exécution de l’application une exception sera levée.</p>
<p>Pour corriger cela,  vous allez ajouter les lignes de code suivantes dans le fichier _AppStart qui se trouve à la racine de votre application :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@<span style="color: #0000ff;">using</span> DB = System.Data.Entity;<br />@{<br />  <br />    DB.Database.SetInitializer(<span style="color: #0000ff;">new</span> DB.DropCreateDatabaseIfModelChanges&lt;WebMatrixCrudAppContext&gt;());<br />}</pre>
<p></div>
<p>En cas de modification du modèle objet lors de l’exécution de l’application, ces lignes de code vont permettre de régénérer la base de données qui correspondra au nouveau modèle.</p>
<p>Attention, la base de données sera recréée à nouveau, donc toutes les données présentes dans celle-ci seront perdues.</p>
<p><strong>Création d’un Repository</strong></p>
<p>Les bonnes pratiques de développement avec Entity Framework recommandent l’utilisation d’un Repository pour les opérations CRUD. Le Repository permet de créer une couche d’abstraction entre la couche d’accès aux données et la logique métier de l’application, et éviter ainsi une dépendance entre la base de données et la logique métier.</p>
<p>Le code du Repository permettant d’effectuer des opérations CRUD sur l’entité Personne est le suivant :</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">using</span> System;<br /><span style="color: #0000ff">using</span> System.Collections.Generic;<br /><span style="color: #0000ff">using</span> System.Data;<br /><span style="color: #0000ff">using</span> System.Data.Entity;<br /><span style="color: #0000ff">using</span> System.Web;<br /><br /><span style="color: #008000">/// &lt;summary&gt;</span><br /><span style="color: #008000">/// Summary description for ClassName</span><br /><span style="color: #008000">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> PersonneRepository<br />{<br />    <span style="color: #0000ff">private</span> WebMatrixCrudAppContext _context = <span style="color: #0000ff">new</span> WebMatrixCrudAppContext();<br /><br />    <span style="color: #0000ff">public</span> Personne Find(<span style="color: #0000ff">int</span> id)<br />    {<br />        <span style="color: #0000ff">return</span> _context.Personnes.Find(id);<br />    }<br /><br />    <span style="color: #0000ff">public</span> List&lt;Personne&gt; GetAll()<br />    {<br />       <span style="color: #0000ff">return</span> _context.Personnes.ToList();<br /><br />    } <br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Add(Personne personne)<br /><br />    {<br />        _context.Personnes.Add(personne);<br />       _context.SaveChanges();<br />    }<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Delette(Personne  personne)<br />    {<br />       _context.Personnes.Remove(personne);<br />       _context.SaveChanges();<br />    }<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Update(Personne personne)<br />    {<br />      _context.Entry(personne).State = EntityState.Modified;<br />      _context.SaveChanges();<br />    <br />    }<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Remove(Personne personne)<br />    {<br />      _context.Personnes.Remove(personne);<br />      _context.SaveChanges();<br />    }<br />}</pre>
<p></div>
<p>Ce code doit être ajouté dans un fichier PersonneRepository.cs dans le dossier App_Code. Créez de même les Repository pour les entités Organisme et Affiliation respectivement dans les fichiers OrganismeRepository.cs et AffiliationRepository.cs.<br />
La fonction Find() pour AffiliationRepository doit prendre deux valeurs en paramètre. Le code doit ressembler à ceci :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> Affiliation Find(<span style="color: #0000ff;">int</span> personneId, <span style="color: #0000ff;">int</span> organismeId)<br />    {<br />        <span style="color: #0000ff;">return</span> _context.Affiliations.Find(personneId, organismeId);<br />    }</pre>
<p></div>
<p>La partie suivante portera sur l’implémentation des fonctionnalités CRUD pour nos différentes tables.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 5 : implémentation des fonctionnalités CRUD, cas d&#8217;une table associative</title>
		<link>https://blog.developpez.com/lilroma/p10993/net/creation_d_une_application_crud_avec_web_4</link>
		<comments>https://blog.developpez.com/lilroma/p10993/net/creation_d_une_application_crud_avec_web_4#comments</comments>
		<pubDate>Sat, 28 Apr 2012 11:25:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&#8217;une application CRUD avec WebMatrix, Razor et Entity Framework. &#8211; Part 1 : introduction et présentation des outils &#8211; Part 2 : création de l&#8217;application &#8230; <a href="https://blog.developpez.com/lilroma/p10993/net/creation_d_une_application_crud_avec_web_4">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p>&#8211; Part 1 : <a href="http://blog.developpez.com/lilroma/p10870/">introduction et présentation des outils</a></p>
<p>&#8211; Part 2 : <a href="http://blog.developpez.com/lilroma/p10876/">création de l&rsquo;application et définition du modèle objet</a></p>
<p>&#8211; Part 3 : <a href="http://blog.developpez.com/lilroma/p10896/">création du DBContex et du Repository</a></p>
<p>&#8211; Part 4 : <a href="http://blog.developpez.com/lilroma/p10980/">implémentation des fonctionnalités CRUD</a></p>
<p>Dans cette cinquième et dernière partie de notre tutoriel sur la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework, nous verrons comment implémenter les interfaces Web pour la lecture, la modification, la suppression et l&rsquo;enregistrement des données pour une table associative.</p>
<p><span id="more-57"></span></p>
<p>La table Affiliations étant une table association, quelques modifications seront donc nécessaires au code utilisé pour Personne et Organisme.</p>
<p><strong>1 &#8211; Implémentation de la grille</strong></p>
<p>Dans le dossier Affiliations, ajoutez un nouveau fichier Index.cshtml.</p>
<p>Dans ce fichier, ajoutez les lignes de code suivantes, qui vont permettre d&rsquo;afficher dans cette page la liste des affiliations qui ont été enregistrées dans la base de données :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 1200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">@{<br />    <span style="color: #008000">/// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Gestion des organismes&quot;</span>;<br />    <span style="color: #008000">//déclaration des variables</span><br />    var af = <span style="color: #0000ff">new</span> AffiliationRepository();<br />   <span style="color: #008000">//déclaration de la grille</span><br />    var grid = <span style="color: #0000ff">new</span> WebGrid(af.GetAll(),rowsPerPage : 10);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h1&gt;Affiliations.&lt;/h1&gt;<br />&lt;/hgroup&gt;  <br /><br />&lt;p&gt;&lt;a href=<span style="color: #006080">&quot;Create&quot;</span>&gt;Ajouter un nouvel enregistrement&lt;/a&gt;&lt;/p&gt;<br />    @* formatage et affichage de la grille *@<br />        @grid.GetHtml(tableStyle:<span style="color: #006080">&quot;grid&quot;</span>,<br />        headerStyle:<span style="color: #006080">&quot;head&quot;</span>,<br />        alternatingRowStyle: <span style="color: #006080">&quot;altrow&quot;</span>,<br />            columns: grid.Columns(<br />                grid.Column(<span style="color: #006080">&quot;Personne.Nom&quot;</span>,<span style="color: #006080">&quot;Employé&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;Organisme.Nom&quot;</span>,<span style="color: #006080">&quot;Organisme&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;Fonction&quot;</span>, <span style="color: #006080">&quot;Fonction&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;Telephone&quot;</span>, <span style="color: #006080">&quot;Téléphone&quot;</span>),<br /><br />                grid.Column(<span style="color: #006080">&quot;&quot;</span>, <span style="color: #006080">&quot;&quot;</span>, format: @&lt;text&gt;&lt;a href=<span style="color: #006080">&quot;Edit?organismeId=@item.OrganismeId&amp;personneId=@item.PersonneId&quot;</span>)&gt;Editer&lt;/a&gt;<br />                        | &lt;a href=<span style="color: #006080">&quot;Details?organismeId=@item.OrganismeId&amp;personneId=@item.PersonneId&quot;</span>)&gt;Détails&lt;/a&gt;<br />                        | &lt;a href=<span style="color: #006080">&quot;Delete?organismeId=@item.OrganismeId&amp;personneId=@item.PersonneId&quot;</span>)&gt;Supprimer&lt;/a&gt;&lt;/text&gt;)<br />                    )<br />        <br />        )</pre>
<p></div>
<p>Vous remarquez certainement pour les colonnes Employé et Organisme, l&rsquo;affichage des propriétés Personne.Nom et Organisme.Nom. En effet, lors de la définition de l&rsquo;entité Affiliation, vous avez défini les classes Personne et Organisme comme propriétés de l&rsquo;entité. Cela permet à Entity Framework de charger automatiquement dans ces propriétés les données correspondantes aux clés étrangères dans la table Affiliations.</p>
<p>A l&rsquo;exécution de cette page, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/listeaffiliations.png" alt="" title="" /></p>
<p><strong>2 &#8211; Affichage détaillé</strong></p>
<p>Dans la page précédente, certaines informations comme l&rsquo;adresse email n&rsquo;ont pas été affichées dans la grille. Pour visualiser ces données, une page d&rsquo;affichage détaillé doit être ajoutée à l&rsquo;application.</p>
<p>Pour ajouter cette page, faites un clic droit sur le dossier Affiliation, sélectionnez l&rsquo;option New File et créez un nouveau fichier Detail.cshtml.</p>
<p>Dans ce fichier, vous allez ajouter les lignes de code suivantes :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 1200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@{<br />    <br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Détails"</span>;<br />   <span style="color: #008000;">//Recupération des Id</span><br />    <span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />    <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br />    <span style="color: #008000;">//Déclaration des variables</span><br />    var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />    var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br />    <span style="color: #008000;">//Selection de l'élément correspondant aux Id</span><br />   affiliation = af.Find(personneId, organismeId);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h1&gt;Détails.&lt;/h1&gt;<br />&lt;/hgroup&gt;  <br /> &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"employe"</span>&gt;<br />                &lt;label&gt;Employé:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Personne.Prenom @affiliation.Personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"organisme"</span>&gt;<br />                &lt;label&gt;Organisme:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Organisme.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"fonction"</span>&gt;<br />                &lt;label&gt;Fonction:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Fonction&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"email"</span>&gt;<br />                &lt;label&gt;Adresse mail:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Email&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"telephone"</span>&gt;<br />                &lt;label&gt;Téléphone:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Telephone&lt;/label&gt;<br />            &lt;/li&gt;<br />        &lt;/ol&gt; <br />    &lt;/fieldset&gt;<br /><br />&lt;p&gt;&lt;a href=<span style="color: #006080;">"Edit?organismeId=@affiliation.OrganismeId&amp;personneId=@affiliation.PersonneId"</span>&gt;Editer&lt;/a&gt; |<br /> &lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br />&lt;/p&gt;</pre>
<p></div>
<p>A l&rsquo;exécution, vous obtiendrez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/detailsaffiliations.png" alt="" title="" /></p>
<p><strong>3 &#8211; Enregistrement</strong></p>
<p>Compte tenu du fait que Affiliations est une table association, vous allez dans un premier temps charger dans des listes déroulantes les noms des personnes et des organismes.</p>
<p>Pour cela, dans le fichier Create.cshtml que vous avez ajouté au dossier Affiliation, vous allez insérer les lignes de code suivantes :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br />    var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />    var og = <span style="color: #0000ff;">new</span> OrganismeRepository();<br />   <br />    var personnes = <span style="color: #0000ff;">new</span> List&lt;Personne&gt;();<br />    var organismes = <span style="color: #0000ff;">new</span> List&lt;Organisme&gt;();<br /><br />    personnes = pr.GetAll();<br />    organismes = og.GetAll();</pre>
<p></div>
<p>Une boucle foreach sera utilisée pour charger les données dans une liste déroulante HTML. Le code pour effectuer cela est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;select id=<span style="color: #006080;">"personneId"</span> name=<span style="color: #006080;">"personneId"</span>&gt;<br />                    @<span style="color: #0000ff;">foreach</span>(var p <span style="color: #0000ff;">in</span> personnes){<br />                    &lt;option <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@p.PersonneId"</span>&gt;@p.Nom&lt;/option&gt;<br />                    }<br />                &lt;/select&gt;</pre>
<p></div>
<p>En plus de la validation des champs, une vérification doit être effectuée pour éviter les contraintes de validation des clés. Le code pour cela est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">if</span> (db.Affiliations.Find(personneId, organismeId) != <span style="color: #0000ff;">null</span>)<br />            { <br />                <br />                <span style="color: #008000;">//Ajout d'un message d'erreur si les Id existent déjà dans la table affiliations</span><br />                 ModelState.AddError(<span style="color: #006080;">"personneId"</span>,<span style="color: #006080;">"Cet enregistrement existe déjà dans la base de données"</span>);<br />            }</pre>
<p></div>
<p>Le code complet de la page Create.cshtml est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 2200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">@{<br />   <span style="color: #008000">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Enregistrement d'un organisme&quot;</span>;<br /><br />    <span style="color: #008000">// initialisation des variables</span><br />    var fonction = <span style="color: #006080">&quot;&quot;</span>;<br />    var email = <span style="color: #006080">&quot;&quot;</span>;<br />    var telephone = <span style="color: #006080">&quot;&quot;</span>;<br />    <span style="color: #008000">//Lecture des données sur les personnes et les organismes</span><br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var og = <span style="color: #0000ff">new</span> OrganismeRepository();<br />    var af = <span style="color: #0000ff">new</span> AffiliationRepository();<br /><br />   <br />    var personnes = <span style="color: #0000ff">new</span> List&lt;Personne&gt;();<br />    var organismes = <span style="color: #0000ff">new</span> List&lt;Organisme&gt;();<br /><br />    personnes = pr.GetAll();<br />    organismes = og.GetAll(); <br /><br /><br />     <span style="color: #008000">// Ajout des scripts de validation</span><br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery-1.6.2.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;</span>);<br /><br />    <span style="color: #008000">// Validation de la fonction</span><br />    Validation.RequireField(<span style="color: #006080">&quot;fonction&quot;</span>, <span style="color: #006080">&quot;La fonction est obligatoire.&quot;</span>);<br />    <br />   <br />    <span style="color: #0000ff">if</span> (IsPost) {<br />        <span style="color: #0000ff">int</span> personneId = Request.Form[<span style="color: #006080">&quot;personneId&quot;</span>].AsInt();<br />        <span style="color: #0000ff">int</span> organismeId = Request.Form[<span style="color: #006080">&quot;organismeId&quot;</span>].AsInt();<br />        fonction = Request.Form[<span style="color: #006080">&quot;fonction&quot;</span>];<br />        email = Request.Form[<span style="color: #006080">&quot;email&quot;</span>];<br />        telephone = Request.Form[<span style="color: #006080">&quot;telephone&quot;</span>];<br />        <br />        <span style="color: #0000ff">if</span> (af.Find(personneId, organismeId) != <span style="color: #0000ff">null</span>)<br />            { <br />                <br />                <span style="color: #008000">//Ajout d'un message d'erreur si les Id exitent déjà dans la table affiliations</span><br />                 ModelState.AddError(<span style="color: #006080">&quot;personneId&quot;</span>,<span style="color: #006080">&quot;Cet enregistrement existe déjà dans la base de données&quot;</span>);<br />            }<br />  <br />        <br />        <span style="color: #0000ff">if</span> (Validation.IsValid()) { <br />              <br />            <span style="color: #0000ff">if</span>(ModelState.IsValid) {   <br />                 var affiliation = <span style="color: #0000ff">new</span> Affiliation{<br />                PersonneId = personneId, OrganismeId = organismeId, Fonction = fonction, Email = email, Telephone = telephone };<br />           <br />                 af.Add(affiliation);<br />   <br />                 Response.Redirect(<span style="color: #006080">&quot;Index&quot;</span>);<br />             }<br />             }<br /><br />    };<br />   <br />                  <br />        }    <br />   <br /><br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h2&gt;Enregistrement d<span style="color: #006080">'une affiliation&lt;/h2&gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=&quot;post&quot; action=&quot;&quot;&gt;<br />    @* Notification en cas d'</span>erreur de validation *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Formlaire &lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;personneId&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;personneId&quot;</span> &gt;Employé:&lt;/label&gt;<br />                &lt;select id=<span style="color: #006080">&quot;personneId&quot;</span> name=<span style="color: #006080">&quot;personneId&quot;</span>&gt;<br />                    @<span style="color: #0000ff">foreach</span>(var p <span style="color: #0000ff">in</span> personnes){<br />                    &lt;option <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@p.PersonneId&quot;</span>&gt;@p.Nom&lt;/option&gt;<br />                    }<br />                &lt;/select&gt;<br />            &lt;/li&gt;<br />            <br />             &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;organismeId&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;organismeId&quot;</span> &gt;Organisme:&lt;/label&gt;<br />                &lt;select id=<span style="color: #006080">&quot;organismeId&quot;</span> name=<span style="color: #006080">&quot;organismeId&quot;</span>&gt;<br />                    @<span style="color: #0000ff">foreach</span>(var o <span style="color: #0000ff">in</span> organismes){<br />                    &lt;option <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@o.OrganismeId&quot;</span>&gt;@o.Nom&lt;/option&gt;<br />                    }<br />                &lt;/select&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;fonction&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;fonction&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;fonction&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Fonction:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;fonction&quot;</span> name=<span style="color: #006080">&quot;fonction&quot;</span> title=<span style="color: #006080">&quot;Fonction&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@fonction&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;fonction&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;fonction&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;email&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;email&quot;</span>&gt;Adresse mail:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;email&quot;</span> name=<span style="color: #006080">&quot;email&quot;</span> title=<span style="color: #006080">&quot;Email&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@email&quot;</span> /&gt;<br />             <br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;telephone&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;telephone&quot;</span>&gt;Numéro de téléphone:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;telephone&quot;</span> name=<span style="color: #006080">&quot;telephone&quot;</span> title=<span style="color: #006080">&quot;Téléphone&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@telephone&quot;</span> /&gt;<br />                <br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Enregistrer&quot;</span> title=<span style="color: #006080">&quot;Enregistrer&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br />&lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;</pre>
<p></div>
<p>A l&rsquo;exécution, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/enregaffiliation.png" alt="" title="" /></p>
<p><strong>4 &#8211; Modification</strong></p>
<p>Penchons-nous maintenant sur la page permettant de modifier les informations d&rsquo;une affiliation. Une nouvelle page Edit.cshtml doit être ajoutée dans le dossier Affiliation.</p>
<p>Dans cette page, vous allez dans un premier temps écrire le code permettant de retourner les informations sur la ligne qui doit être modifiée :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />   <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br /><br />   <span style="color: #008000;">// initialisation des variables</span><br />   var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />   var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br />   affiliation = af.Find(personneId, organismeId);<br /><br />   var fonction = affiliation.Fonction;<br />   var email = affiliation.Email;<br />   var telephone = affiliation.Telephone;</pre>
<p></div>
<p>Le code permettant de prendre en compte les modifications dans la base de données avec Entity Framework est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">affiliation.Fonction = fonction;<br />affiliation.Email = email;<br />affiliation.Telephone = telephone;<br /><span style="color: #008000;">//Modification de l'affiliation</span><br />af.Update(affiliation);</pre>
<p></div>
<p>Le code complet pour cette page est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 2200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@<span style="color: #0000ff;">using</span> System.Data<br />@{<br />    <span style="color: #008000;">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Modification"</span>;<br /><br />   <br />    <span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />    <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br /><br />    <span style="color: #008000;">// initialisation des variables</span><br />    var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />    var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br /><br />    affiliation = af.Find(personneId, organismeId);<br /><br />    var fonction = affiliation.Fonction;<br />    var email = affiliation.Email;<br />    var telephone = affiliation.Telephone;<br />   <br />    <span style="color: #008000;">// Ajout des scripts de validation</span><br />    Scripts.Add(<span style="color: #006080;">"~/Scripts/jquery-1.6.2.min.js"</span>);<br />    Scripts.Add(<span style="color: #006080;">"~/Scripts/jquery.validate.min.js"</span>);<br />    Scripts.Add(<span style="color: #006080;">"~/Scripts/jquery.validate.unobtrusive.min.js"</span>);<br /><br />     <span style="color: #008000;">// Validation de la fonction</span><br />    Validation.RequireField(<span style="color: #006080;">"fonction"</span>, <span style="color: #006080;">"La fonction est obligatoire."</span>);<br />   <br /><br />    <span style="color: #0000ff;">if</span> (IsPost) {<br />        fonction = Request.Form[<span style="color: #006080;">"fonction"</span>];<br />        email = Request.Form[<span style="color: #006080;">"email"</span>];<br />        telephone = Request.Form[<span style="color: #006080;">"telephone"</span>];<br />        <br />          <span style="color: #0000ff;">if</span> (Validation.IsValid()) { <br />                <br />                 affiliation.Fonction = fonction;<br />                 affiliation.Email = email;<br />                 affiliation.Telephone = telephone;<br />                 <span style="color: #008000;">//Modification de l'affiliation</span><br />                 af.Update(affiliation);<br /><br />                 Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />                <br />             }<br />    };<br />   <br />                  <br />        }    <br />   <br /><br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h2&gt;Modification.&lt;/h2&gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=<span style="color: #006080;">"post"</span> action=<span style="color: #006080;">""</span>&gt;<br />     @* Notification en cas d'erreur de validation *@<br />    @Html.ValidationSummary(<span style="color: #006080;">"Veuillez corriger les erreurs suivantes:"</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />             &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"employe"</span>&gt;<br />                &lt;label&gt;Employé:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Personne.Prenom @affiliation.Personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"organisme"</span>&gt;<br />                &lt;label&gt;Organisme:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Organisme.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"fonction"</span>&gt;<br />                &lt;label <span style="color: #0000ff;">for</span>=<span style="color: #006080;">"fonction"</span> @<span style="color: #0000ff;">if</span>(!ModelState.IsValidField(<span style="color: #006080;">"fonction"</span>)){&lt;text&gt;<span style="color: #0000ff;">class</span>=<span style="color: #006080;">"error-label"</span>&lt;/text&gt;}&gt;Fonction:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080;">"text"</span> id=<span style="color: #006080;">"fonction"</span> name=<span style="color: #006080;">"fonction"</span> title=<span style="color: #006080;">"Fonction"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@fonction"</span> @Validation.GetHtml(<span style="color: #006080;">"fonction"</span>) /&gt;<br />                @* Write any email validation errors to the page *@<br />                @Html.ValidationMessage(<span style="color: #006080;">"fonction"</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"email"</span>&gt;<br />                &lt;label <span style="color: #0000ff;">for</span>=<span style="color: #006080;">"email"</span>&gt;Adresse mail:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080;">"text"</span> id=<span style="color: #006080;">"email"</span> name=<span style="color: #006080;">"email"</span> title=<span style="color: #006080;">"Email"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@email"</span> /&gt;<br />             <br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"telephone"</span>&gt;<br />                &lt;label <span style="color: #0000ff;">for</span>=<span style="color: #006080;">"telephone"</span>&gt;Numéro de téléphone:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080;">"text"</span> id=<span style="color: #006080;">"telephone"</span> name=<span style="color: #006080;">"telephone"</span> title=<span style="color: #006080;">"Téléphone"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"@telephone"</span> /&gt;<br />                <br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080;">"submit"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"Modifier"</span> title=<span style="color: #006080;">"Edit"</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br />&lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br /></pre>
<p></div>
<p>qui produit le résultat suivant à l&rsquo;exécution :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/modifaffiliation.png" alt="" title="" /></p>
<p><strong>5 &#8211; Suppression</strong></p>
<p>Enfin, pour finir avec cette table, vous allez créer la page Delete.cshtml dans le dossier Affiliation.</p>
<p>Le code source de cette page n&rsquo;a rien de particulier et reprend les principes qui ont été utilisés pour implémenter la page de suppression pour la table Personnes.</p>
<p>Le code complet pour cette page est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 1200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@{<br />    <span style="color: #008000;">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Suppression"</span>;<br /><br />    <span style="color: #0000ff;">int</span> personneId = Request[<span style="color: #006080;">"personneId"</span>].AsInt();<br />    <span style="color: #0000ff;">int</span> organismeId = Request[<span style="color: #006080;">"organismeId"</span>].AsInt();<br /><br />    var af = <span style="color: #0000ff;">new</span> AffiliationRepository();<br />    var affiliation = <span style="color: #0000ff;">new</span> Affiliation();<br />    <span style="color: #008000;">//Recherche de l'affiliation à supprimerf</span><br />    affiliation = af.Find(personneId, organismeId);<br /><br />    <span style="color: #0000ff;">if</span>(IsPost)<br />    {<br />            <span style="color: #008000;">//Supression de l'enregistrement</span><br />            af.Remove(affiliation);<br />            Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />    }<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h1&gt;Suppression.&lt;/h1&gt;<br />   &lt;h3&gt;Êtes-vous sur de vouloir supprimer cet enregistrement ?&lt;/h3&gt;<br />&lt;/hgroup&gt;  <br /> &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"employe"</span>&gt;<br />                &lt;label&gt;Employé:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Personne.Prenom @affiliation.Personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            <br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"organisme"</span>&gt;<br />                &lt;label&gt;Organisme:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Organisme.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"fonction"</span>&gt;<br />                &lt;label&gt;Fonction:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Fonction&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"email"</span>&gt;<br />                &lt;label&gt;Adresse mail:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Email&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"telephone"</span>&gt;<br />                &lt;label&gt;Téléphone:&lt;/label&gt;<br />                &lt;label&gt;@affiliation.Telephone&lt;/label&gt;<br />            &lt;/li&gt;<br />        &lt;/ol&gt; <br /> <br />    &lt;/fieldset&gt;<br /><br /><br />&lt;form method=<span style="color: #006080;">"post"</span> action=<span style="color: #006080;">""</span>&gt;<br />    &lt;p&gt;<br />    &lt;input type=<span style="color: #006080;">"submit"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"Supprimer"</span> title=<span style="color: #006080;">"Supprimer"</span> /&gt;<br /> &lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br />    &lt;/p&gt;<br />    &lt;/form&gt;</pre>
<p></div>
<p>Il permet d&rsquo;obtenir le résultat suivant à l&rsquo;exécution :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/deleteaffiliation.png" alt="" title="" /></p>
<p><strong>Conclusion</strong></p>
<p>Entity Framework, la technologie d&rsquo;accès aux données qui est en passe de devenir un standard dans l&rsquo;écosystème .NET peut être assez facilement exploitée avec WebMatrix pour la création d&rsquo;applications Web robustes. Bien que l&rsquo;éditeur WebMatrix manque beaucoup de fonctionnalités et d&rsquo;extensions qui sont disponibles dans Visual Studio, comme l&rsquo;échafaudage pour développer rapidement et facilement des applications utilisant Entity Framework, il permet néanmoins au développeur d&rsquo;exploiter quasiment toutes les fonctionnalités de la librairie et supporte l&rsquo;IntelliSence pour celle-ci.</p>
<p>Ce tutoriel nous a permis de concevoir bout-à-bout une petite solution complète de gestion des affiliations en utilisant Entity Framework, WebMatrix, Razor, NuGet et SQL Server Compact Edition et nous familiariser avec tous ces outils qui sont assez utilisés dans l&rsquo;environnement .NET.</p>
<p>Vous pouvez donc vous baser sur cet exemple ou en modifier le code à votre guise pour développer votre propre application répondant à vos besoins fonctionnels avec WebMatrix.</p>
<p><strong>Sources</strong></p>
<p>Vous pouvez télécharger et modifier les sources ci-dessous à votre convenance.</p>
<p><img src="http://www.developpez.be/images/kitsrc.jpg" alt="" title="" /> <a href="ftp://ftp-developpez.com/rdonfack/WebMatrixCrudApp.rar">Version RAR</a></p>
<p><img src="http://www.developpez.be/images/kitsrc.jpg" alt="" title="" /> <a href="ftp://ftp-developpez.com/rdonfack/WebMatrixCrudApp.zip">Version ZIP</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 4 : Implémentation des fonctionnalités CRUD</title>
		<link>https://blog.developpez.com/lilroma/p10980/net/creation_d_une_application_crud_avec_web_3</link>
		<comments>https://blog.developpez.com/lilroma/p10980/net/creation_d_une_application_crud_avec_web_3#comments</comments>
		<pubDate>Wed, 25 Apr 2012 10:51:38 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Nuget]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&#8217;une application CRUD avec WebMatrix, Razor et Entity Framework. &#8211; Part 1 : introduction et présentation des outils &#8211; Part 2 : création de l&#8217;application &#8230; <a href="https://blog.developpez.com/lilroma/p10980/net/creation_d_une_application_crud_avec_web_3">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p>&#8211; Part 1 : <a href="http://blog.developpez.com/lilroma/p10870/">introduction et présentation des outils</a></p>
<p>&#8211; Part 2 : <a href="http://blog.developpez.com/lilroma/p10876/">création de l&rsquo;application et définition du modèle objet</a></p>
<p>&#8211; Part 3 : <a href="http://blog.developpez.com/lilroma/p10896/">création du DBContex et du Repository</a></p>
<p>Dans les parties précédentes, nous nous sommes familiarisés avec outils utilisés, nous avons procédé à la création de l’application, à la définition du modèle objet qui sera utilisé ainsi qu&rsquo;à la création du DBContex et du Repository.</p>
<p>Dans cette partie, nous allons nous plonger dans le vif du sujet en implémentant les interfaces Web pour la lecture, la modification, la suppression et l&rsquo;enregistrement des données dans votre base de données.</p>
<p><span id="more-56"></span></p>
<p>Vous allez dans un premier temps créé un nouveau dossier Personne qui contiendra tous les fichiers pour la gestion des personnes.</p>
<p><strong>1 &#8211; Implémentation de la grille des données</strong></p>
<p>Dans le dossier Personne, ajoutez un nouveau fichier Index.cshtml.</p>
<p>Vous allez ensuite ajouter en début de ce fichier les lignes de code permettant de retourner la liste des personnes qui sont enregistrées dans la base de données. Cette liste sera par la suite affichée grâce au Helper Razor WebGrid, qui va être instancié en passant en paramètre la collection des données qui doivent être affichées et le nombre d&rsquo;éléments sur une page.</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><br />var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />var grid = <span style="color: #0000ff">new</span> WebGrid(pr.GetAll(),rowsPerPage : 10);</pre>
<p></div>
<p>Avant d&rsquo;afficher la grille, vous allez procéder au formatage de celle-ci en définissant les colonnes qui seront affichées et en ajoutant notamment de nouvelles colonnes pour l&rsquo;édition, la consultation et la suppression d&rsquo;une ligne de la grille.</p>
<p>Le code pour effectuer cela est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">@grid.GetHtml(tableStyle:<span style="color: #006080">&quot;grid&quot;</span>,<br />  headerStyle:<span style="color: #006080">&quot;head&quot;</span>,<br />    alternatingRowStyle: <span style="color: #006080">&quot;altrow&quot;</span>,<br />         columns: grid.Columns(<br />          grid.Column(<span style="color: #006080">&quot;Nom&quot;</span>,<span style="color: #006080">&quot;Nom&quot;</span>),<br />             grid.Column(<span style="color: #006080">&quot;Prenom&quot;</span>, <span style="color: #006080">&quot;Prénom&quot;</span>),<br />                grid.Column(<span style="color: #006080">&quot;&quot;</span>, <span style="color: #006080">&quot;&quot;</span>, format: @&lt;text&gt;&lt;a href=<span style="color: #006080">&quot;Edit/@item.PersonneId&quot;</span>)&gt;Editer&lt;/a&gt; <br />                       | &lt;a href=<span style="color: #006080">&quot;Details/@item.PersonneId&quot;</span>)&gt;Détails&lt;/a&gt; <br />                         | &lt;a href=<span style="color: #006080">&quot;Delete/@item.PersonneId&quot;</span>)&gt;Supprimer&lt;/a&gt;&lt;/text&gt;)                                                                                     <br />                )<br />        <br />        )</pre>
<p></div>
<p>Le code complet de la page Index.cshtml est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 1200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">@{<br />    <span style="color: #008000">// Set the layout page and page title</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Register an Account&quot;</span>;<br /><br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var grid = <span style="color: #0000ff">new</span> WebGrid(pr.GetAll(),rowsPerPage : 10);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h1&gt;Personnes.&lt;/h1&gt;<br />&lt;/hgroup&gt;  <br /><br />&lt;p&gt;&lt;a href=<span style="color: #006080">&quot;Create&quot;</span>&gt;Ajouter un nouvel enregistrement&lt;/a&gt;&lt;/p&gt;<br />        <br />   @grid.GetHtml(tableStyle:<span style="color: #006080">&quot;grid&quot;</span>,<br />        headerStyle:<span style="color: #006080">&quot;head&quot;</span>,<br />        alternatingRowStyle: <span style="color: #006080">&quot;altrow&quot;</span>,<br />                columns: grid.Columns(<br />                    grid.Column(<span style="color: #006080">&quot;Nom&quot;</span>,<span style="color: #006080">&quot;Nom&quot;</span>),<br />                      grid.Column(<span style="color: #006080">&quot;Prenom&quot;</span>, <span style="color: #006080">&quot;Prénom&quot;</span>),<br />                        grid.Column(<span style="color: #006080">&quot;&quot;</span>, <span style="color: #006080">&quot;&quot;</span>, format: @&lt;text&gt;&lt;a href=<span style="color: #006080">&quot;Edit/@item.PersonneId&quot;</span>)&gt;Editer&lt;/a&gt; <br />                              | &lt;a href=<span style="color: #006080">&quot;Details/@item.PersonneId&quot;</span>)&gt;Détails&lt;/a&gt; <br />                              | &lt;a href=<span style="color: #006080">&quot;Delete/@item.PersonneId&quot;</span>)&gt;Supprimer&lt;/a&gt;&lt;/text&gt;)                                                                                     <br />                )<br />        <br />        )</pre>
<p></div>
<p>La ligne de code :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br />&lt;p&gt;&lt;a href=<span style="color: #006080;">"Create"</span>&gt;Ajouter un nouvel enregistrement&lt;/a&gt;&lt;/p&gt;</pre>
<p></div>
<p>va permettre d&rsquo;ajouter les nouvelles informations sur une personne dans la BD. À l&rsquo;exécution, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/ListePersonnes.PNG" alt="" title="" /></p>
<p>le code CSS que j&rsquo;ai utilisé pour le WebGrid et qui a été défini dans le fichier Site.css pour être appliqué à toutes les grilles de l&rsquo;application est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">.grid { margin: 4px; border-collapse: collapse; width: 600px; }<br /> .head { background-color: #E8E8E8; font-weight: bold; color: #FFF; }<br /> .grid th, .grid td { border: 1px solid #C0C0C0; padding: 5px; }<br /> .altrow { background-color: #E8E8E8; color: #000; }</pre>
<p></div>
<p><strong>2 &#8211; Affichage détaillé </strong></p>
<p>mpte tenu du fait que dans certains cas, il vous sera impossible de présenter toutes les informations sur une entité sur une ligne de la grille, un lien qui pointe sur une page &nbsp;&raquo; Details &nbsp;&raquo; a été introduit donc pour afficher des informations détaillées sur une personne.</p>
<p>Nous verrons ici comment implémenter l&rsquo;interface Web de cette page. Pour cela, vous allez ajouter un nouveau fichier Edit.cshtml dans le dossier Personne.</p>
<p>Au début de ce fichier, vous allez déclarer une variable pour récupérer l&rsquo;id qui est passé comme paramètre HTTP. La méthode Find() sera utilisée pour retourner l&rsquo;élément dans la base de données dont l&rsquo;identifiant est égal à celui qui est passé en paramètre.</p>
<p>Le code pour effectuer cela est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">int</span> id = Request[<span style="color: #006080;">"id"</span>].AsInt();<br />    var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff;">new</span> Personne();<br />    personne = pr.Find(id);</pre>
<p></div>
<p>Il ne vous reste plus qu&rsquo;à afficher les informations contenues dans la variable personne dans votre code html.</p>
<p>Le code complet de la page Details.cshtml est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 800px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><br />@{<br />    <span style="color: #008000">// Set the layout page and page title</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Détails&quot;</span>;<br />   <br />    <span style="color: #0000ff">int</span> id = Request[<span style="color: #006080">&quot;id&quot;</span>].AsInt();<br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff">new</span> Personne();<br />    personne = pr.Find(id);<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h1&gt;Détails.&lt;/h1&gt;<br />&lt;/hgroup&gt;  <br /> &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label&gt;Nom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label&gt;Prénom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Prenom&lt;/label&gt;<br />            &lt;/li&gt;<br />        &lt;/ol&gt; <br />    &lt;/fieldset&gt;<br /><br />&lt;p&gt;&lt;a href=<span style="color: #006080">&quot;Edit?id=@id&quot;</span>&gt;Editer&lt;/a&gt; |<br /> &lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;<br />&lt;/p&gt;</pre>
<p></div>
<p>Ce qui permet d&rsquo;obtenir le résultat suivant à l&rsquo;exécution, après un clic sur le lien Détails d&rsquo;une ligne de la grille contenant la liste des personnes :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/detailspersonne.PNG" alt="" title="" /></p>
<p><strong>3 &#8211; Enregistrement des données</strong></p>
<p>Dans la page affichant la liste des personnes, vous avez ajouté un lien permettant d&rsquo;accéder à la page d&rsquo;ajout d&rsquo;un nouvel enregistrement. Penchons-nous maintenant sur l&rsquo;implémentation de cette page. Vous allez ajouter une nouvelle page dans le dossier Personne. Il suffit pour cela de faire un clic droit sur le dossier Personne, sélectionner &nbsp;&raquo; New Files &nbsp;&raquo; et créer un nouveau fichier &nbsp;&raquo; create.cshtml &nbsp;&raquo; dans la fenêtre qui va s&rsquo;afficher.</p>
<p>Le code source du formulaire d&rsquo;enregistrement d&rsquo;une personne est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 800px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">&lt;form method=<span style="color: #006080">&quot;post&quot;</span> action=<span style="color: #006080">&quot;&quot;</span>&gt;<br />    @* Notification en cas d'erreur de validation *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Registration Form&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Enregistrer&quot;</span> title=<span style="color: #006080">&quot;Enregistrer&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;</pre>
<p></div>
<p>Afin d&rsquo;envoyer des données correctes vers votre classe entité pour laquelle vous avez défini certains champs comme obligatoires, vous devez procéder à la validation des données utilisateur.</p>
<p>Les méthodes <strong>@Html.ValidationSummary()</strong> et <strong>@Html.ValidationMessage()</strong> sont utilisées pour afficher les messages d&rsquo;erreurs de validation à l&rsquo;utilisateur.</p>
<p>Vous allez utiliser JQuery et les nouvelles classes de validation System.Web.WebPages.ValidationHelper et System.Web.WebPages.Validator qui ont été introduites par WebPages 2 pour effectuer en seulement quelques lignes de code, des tâches de validation de données puissantes.</p>
<p>Le code pour effectuer cela est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #008000">// Ajout des scripts de validation</span><br />   Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery-1.6.2.min.js&quot;</span>);<br />   Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.min.js&quot;</span>);<br />   Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;</span>);<br /><br />   <span style="color: #008000">// Validation du nom</span><br />   Validation.RequireField(<span style="color: #006080">&quot;nom&quot;</span>, <span style="color: #006080">&quot;Le nom est obligatoire.&quot;</span>);<br />   <span style="color: #008000">// Validation du prénom</span><br />   Validation.RequireField(<span style="color: #006080">&quot;prenom&quot;</span>, <span style="color: #006080">&quot;Le prénom est obligatoire.&quot;</span>);</pre>
<p></div>
<p>Il ne vous reste plus qu&rsquo;à écrire le code permettant d&rsquo;ajouter les données postées par un utilisateur dans la base de données :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br />var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />                 var personne = <span style="color: #0000ff;">new</span> Personne{<br />                 Nom = nom, Prenom = prenom};<br />                 <span style="color: #008000;">//Ajout des données sur la personne</span><br />                 pr.Add(personne);</pre>
<p></div>
<p>Le code complet de la page Create.cshtml est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 1200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><br />@{<br />    <span style="color: #008000">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Register an Account&quot;</span>;<br /><br />    <span style="color: #008000">// initialisation des varaiables</span><br />    var nom = <span style="color: #006080">&quot;&quot;</span>;<br />    var prenom = <span style="color: #006080">&quot;&quot;</span>;<br />   <br />     <span style="color: #008000">// Ajout des scripts de validation</span><br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery-1.6.2.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;</span>);<br /><br />    <span style="color: #008000">// Validation du nom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;nom&quot;</span>, <span style="color: #006080">&quot;Le nom est obligatoire.&quot;</span>);<br />    <span style="color: #008000">// Validation du prénom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;prenom&quot;</span>, <span style="color: #006080">&quot;Le prénom est obligatoire.&quot;</span>);<br />    <span style="color: #008000">//Triatement des données si s'est une requête POST</span><br />    <span style="color: #0000ff">if</span> (IsPost) {<br />        nom = Request.Form[<span style="color: #006080">&quot;nom&quot;</span>];<br />        prenom= Request.Form[<span style="color: #006080">&quot;prenom&quot;</span>];<br />        <br />          <span style="color: #0000ff">if</span> (Validation.IsValid()) { <br />                var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />                 var personne = <span style="color: #0000ff">new</span> Personne{<br />                 Nom = nom, Prenom = prenom};<br />                 <span style="color: #008000">//Ajout des données sur la personne</span><br />                 pr.Add(personne);<br />                 Response.Redirect(<span style="color: #006080">&quot;Index&quot;</span>);<br />             }<br />    };<br />   <br />                  <br />        }    <br />   <br /><br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h1&gt;Ajout d<span style="color: #006080">'un nouvel enregistrement.&lt;/h1&gt;<br />   &gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=&quot;post&quot; action=&quot;&quot;&gt;<br />    @* Notification en cas d'</span>erreur de validation *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Registration Form&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Enregistrer&quot;</span> title=<span style="color: #006080">&quot;Enregistrer&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br />&lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;</pre>
<p></div>
<p>À l&rsquo;exécution de cette page, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/enregpersonne.png" alt="" title="" /></p>
<p>En cas d&rsquo;erreur de validation, vous aurez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/enregpersonneerreurvalidation.png" alt="" title="" /></p>
<p><strong>4 &#8211;  Modification</strong></p>
<p>Après l&rsquo;enregistrement des données sur une personne, voyons maintenant comment nous allons implémenter une nouvelle page permettant de procéder à la mise à jour des informations sur une personne.</p>
<p>Comme vous avez ajouté un lien &nbsp;&raquo; Editer &nbsp;&raquo; dans le tableau des personnes qui pointe sur la page &nbsp;&raquo; Edit &laquo;&nbsp;, vous allez créer un nouveau fichier cshtml ayant ce nom.</p>
<p>La page doit afficher par défaut les informations qui doivent être modifiées dans des zones éditables. Vous allez donc dans un premier temps récupérer ces informations. Le code pour effectuer cela est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">int</span> id = Request[<span style="color: #006080;">"id"</span>].AsInt();<br /><br />    var db = <span style="color: #0000ff;">new</span> WebMatrixCrudAppContext();<br />    var personne = <span style="color: #0000ff;">new</span> Personne();<br />    personne = db.Personnes.Find(id);<br />    <span style="color: #008000;">// initialisation des variables</span><br />    var nom = personne.Nom;<br />    var prenom = personne.Prenom;</pre>
<p></div>
<p>Le code du formulaire de modification est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 800px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">&lt;form method=<span style="color: #006080">&quot;post&quot;</span> action=<span style="color: #006080">&quot;&quot;</span>&gt;<br />    @* If at least one validation error exists, notify the user *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Formulaire de modification&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Modifier&quot;</span> title=<span style="color: #006080">&quot;Modifier&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;</pre>
<p></div>
<p>Le code permettant de prendre en compte les modifications dans la base de données est le suivant</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">personne.Nom = nom;<br />personne.Prenom = prenom;<br /><span style="color: #008000;">//Modification des données sur la personne</span><br />pr.Update(personne);</pre>
<p></div>
<p>Le code complet de la page Edit.cshtml est le suivant :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 1200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">@<span style="color: #0000ff">using</span> System.Data<br />@{<br />    <span style="color: #008000">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080">&quot;~/_SiteLayout.cshtml&quot;</span>;<br />    Page.Title = <span style="color: #006080">&quot;Modification d'une personne&quot;</span>;<br /><br />    <br />    <span style="color: #0000ff">int</span> id = Request[<span style="color: #006080">&quot;id&quot;</span>].AsInt();<br /><br />    var pr = <span style="color: #0000ff">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff">new</span> Personne();<br />    personne = pr.Find(id);<br />    <span style="color: #008000">// initialisation des variables</span><br />    var nom = personne.Nom;<br />    var prenom = personne.Prenom;<br />   <br />    <span style="color: #008000">// Ajout des scripts de validation</span><br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery-1.6.2.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.min.js&quot;</span>);<br />    Scripts.Add(<span style="color: #006080">&quot;~/Scripts/jquery.validate.unobtrusive.min.js&quot;</span>);<br /><br />   <span style="color: #008000">// Validation du nom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;nom&quot;</span>, <span style="color: #006080">&quot;Le nom est obligatoire.&quot;</span>);<br />   <span style="color: #008000">// Validation du prénom</span><br />    Validation.RequireField(<span style="color: #006080">&quot;prenom&quot;</span>, <span style="color: #006080">&quot;Le prénom est obligatoire.&quot;</span>);<br />    <span style="color: #008000">//Traitement des données si s'est une requête POST</span><br />    <span style="color: #0000ff">if</span> (IsPost) {<br />        nom = Request.Form[<span style="color: #006080">&quot;nom&quot;</span>];<br />        prenom= Request.Form[<span style="color: #006080">&quot;prenom&quot;</span>];<br />        <br />          <span style="color: #0000ff">if</span> (Validation.IsValid()) { <br />                <br />                 personne.Nom = nom;<br />                 personne.Prenom = prenom;<br />                 <span style="color: #008000">//Modification des données sur la personne</span><br />                 pr.Update(personne);<br />            <br />                 Response.Redirect(<span style="color: #006080">&quot;Index&quot;</span>);<br />                <br />             }<br />    };<br />   <br />                  <br />        }    <br />   <br /><br />&lt;hgroup <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;title&quot;</span>&gt;<br />    &lt;h1&gt;Mise à jour des données.&lt;/h1&gt;<br />&lt;/hgroup&gt;<br /><br />&lt;form method=<span style="color: #006080">&quot;post&quot;</span> action=<span style="color: #006080">&quot;&quot;</span>&gt;<br />    @* If at least one validation error exists, notify the user *@<br />    @Html.ValidationSummary(<span style="color: #006080">&quot;Veuillez corriger les erreurs suivantes:&quot;</span>)<br /><br />    &lt;fieldset&gt;<br />        &lt;legend&gt;Formulaire de modification&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;nom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;nom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;nom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Nom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;nom&quot;</span> name=<span style="color: #006080">&quot;nom&quot;</span> title=<span style="color: #006080">&quot;Nom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@nom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;nom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;nom&quot;</span>)<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;prenom&quot;</span>&gt;<br />                &lt;label <span style="color: #0000ff">for</span>=<span style="color: #006080">&quot;prenom&quot;</span> @<span style="color: #0000ff">if</span>(!ModelState.IsValidField(<span style="color: #006080">&quot;prenom&quot;</span>)){&lt;text&gt;<span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;error-label&quot;</span>&lt;/text&gt;}&gt;Prénom:&lt;/label&gt;<br />                &lt;input type=<span style="color: #006080">&quot;text&quot;</span> id=<span style="color: #006080">&quot;prenom&quot;</span> name=<span style="color: #006080">&quot;prenom&quot;</span> title=<span style="color: #006080">&quot;Prénom&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;@prenom&quot;</span> @Validation.GetHtml(<span style="color: #006080">&quot;prenom&quot;</span>) /&gt;<br />                @Html.ValidationMessage(<span style="color: #006080">&quot;prenom&quot;</span>)<br />            &lt;/li&gt;<br />        &lt;/ol&gt;<br />        &lt;input type=<span style="color: #006080">&quot;submit&quot;</span> <span style="color: #0000ff">value</span>=<span style="color: #006080">&quot;Modifier&quot;</span> title=<span style="color: #006080">&quot;Modifier&quot;</span> /&gt;<br />        <br />    &lt;/fieldset&gt;<br />&lt;/form&gt;<br /><br />&lt;p&gt;<br /> &lt;a href=<span style="color: #006080">&quot;Index&quot;</span>&gt;Retour à la liste&lt;/a&gt;<br />&lt;/p&gt;</pre>
<p></div>
<p>À l&rsquo;exécution de la page, vous obtenez le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/modifpersonne.png" alt="" title="" /></p>
<p><strong>5 &#8211; Suppression</strong></p>
<p>Pour finir avec la table Personnes, vous allez maintenant écrire le code permettant de supprimer un enregistrement dans la base de données. Créez pour cela une nouvelle page Delete.cshtml.</p>
<p>Afin d&rsquo;éviter les suppressions accidentelles, vous allez dans un premier temps afficher dans cette page le récapitulatif des informations sur une personne avec un message de confirmation de suppression.</p>
<p>Le code pour la page Delete reprend celui de la page Edit, à la différence que vous allez ajouter dans un formulaire un bouton permettant de procéder à la suppression d&rsquo;un enregistrement :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;form method=<span style="color: #006080;">"post"</span> action=<span style="color: #006080;">""</span>&gt;<br />    &lt;p&gt;<br />    &lt;input type=<span style="color: #006080;">"submit"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"Supprimer"</span> title=<span style="color: #006080;">"Supprimer"</span> /&gt;<br /> &lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br />    &lt;/p&gt;<br />    &lt;/form&gt;</pre>
<p></div>
<p>Vous allez également ajouter dans ce fichier le code permettant de supprimer les données dans la base de données en cas de clic sur le bouton supprimer :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br /><span style="color: #0000ff;">if</span>(IsPost)<br />    {<br />            pr.Remove(personne);<br />            Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />    }<br />            </pre>
<p></div>
<p>Le code complet de la page Delete.cshtml est le suivant :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 1200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">@{<br />   <span style="color: #008000;">// Définition du layout et du titre de la page</span><br />    Layout = <span style="color: #006080;">"~/_SiteLayout.cshtml"</span>;<br />    Page.Title = <span style="color: #006080;">"Détails"</span>;<br /><br />    <span style="color: #008000;">//Lecture des données sur une personne</span><br />    <span style="color: #0000ff;">int</span> id = Request[<span style="color: #006080;">"id"</span>].AsInt();<br />    var pr = <span style="color: #0000ff;">new</span> PersonneRepository();<br />    var personne = <span style="color: #0000ff;">new</span> Personne();<br />    personne = pr.Find(id);<br />    <span style="color: #008000;">//Traitement des données si s'est une requête POST</span><br />    <span style="color: #0000ff;">if</span>(IsPost)<br />    {<br />            <span style="color: #008000;">//Supression de l'enregistrement</span><br />            pr.Remove(personne);<br />            Response.Redirect(<span style="color: #006080;">"Index"</span>);<br />    }<br />                  <br />}    <br />&lt;hgroup <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"title"</span>&gt;<br />    &lt;h1&gt;Suppression.&lt;/h1&gt;<br />   &lt;h3&gt;Êtes-vous sur de vouloir supprimer cet enregistrement ?&lt;/h3&gt;<br />&lt;/hgroup&gt;  <br /> &lt;fieldset&gt;<br />        &lt;legend&gt;&lt;/legend&gt;<br />        &lt;ol&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"nom"</span>&gt;<br />                &lt;label&gt;Nom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Nom&lt;/label&gt;<br />            &lt;/li&gt;<br />            &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #006080;">"prenom"</span>&gt;<br />                &lt;label&gt;Prénom:&lt;/label&gt;<br />                &lt;label&gt;@personne.Prenom&lt;/label&gt;<br />            &lt;/li&gt;<br />        &lt;/ol&gt; <br /> <br />    &lt;/fieldset&gt;<br /><br /><br />&lt;form method=<span style="color: #006080;">"post"</span> action=<span style="color: #006080;">""</span>&gt;<br />    &lt;p&gt;<br />    &lt;input type=<span style="color: #006080;">"submit"</span> <span style="color: #0000ff;">value</span>=<span style="color: #006080;">"Supprimer"</span> title=<span style="color: #006080;">"Supprimer"</span> /&gt;<br /> &lt;a href=<span style="color: #006080;">"Index"</span>&gt;Retour à la liste&lt;/a&gt;<br />    &lt;/p&gt;<br />    &lt;/form&gt;</pre>
<p></div>
<p>Ce qui donne le résultat suivant à l&rsquo;exécution :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/webmatrix-application-crud-entity-framework/images/deletepersonne.png" alt="" title="" /></p>
<p>Compte tenu du fait que l&rsquo;implémentation des fonctionnalités pour la table Organismes reprend plusieurs des principes et méthodes qui ont été utilisés pour la table Personnes, nous n&rsquo;allons plus revenir sur la création des pages d&rsquo;affichage, d&rsquo;enregistrement, de mise à jour ou de suppression d&rsquo;un organisme.</p>
<p>Pour écrire le code de ces pages, veuillez vous référer à celui pour la table Personnes ou à défaut, regarder le code source pour ces pages dans les fichiers du projet qui sont disponibles en téléchargement à la fin de l&rsquo;article.</p>
<p>La prochaine et dernière partie portera donc sur l’implémentation des fonctionnalités CRUD pour la table Affiliations, qui sera un peu différente puisque c&rsquo;est table association.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d’une application CRUD avec WebMatrix, Razor et Entity Framework Part 2 : création de l&#8217;application et définition du modèle objet</title>
		<link>https://blog.developpez.com/lilroma/p10876/net/creation_d_une_application_crud_avec_web_1</link>
		<comments>https://blog.developpez.com/lilroma/p10876/net/creation_d_une_application_crud_avec_web_1#comments</comments>
		<pubDate>Sun, 25 Mar 2012 14:07:24 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[RAZOR]]></category>
		<category><![CDATA[WebMatrix]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&#8217;une application CRUD avec WebMatrix, Razor et Entity Framework. Dans la première partie introductive, nous avons présenté le but de cet article et les différents &#8230; <a href="https://blog.developpez.com/lilroma/p10876/net/creation_d_une_application_crud_avec_web_1">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d&rsquo;une application CRUD avec WebMatrix, Razor et Entity Framework.</p>
<p>Dans <a href="http://blog.developpez.com/lilroma/p10870/">la première partie introductive</a>, nous avons présenté le but de cet article et les différents outils qui seront utilisés pour l’implémentation de notre application CRUD.</p>
<p>Cette seconde partie portera essentiellement sur la création de l&rsquo;application avec WebMatrix, l’installation d&rsquo;Entity Framework à partir de NuGet et la définition du modèle objet.</p>
<p><span id="more-53"></span></p>
<p><strong>Création de l’application</strong></p>
<p>Maintenant que nous nous sommes familiarisés avec les différents outils que nous allons utiliser, nous pouvons maintenant procéder à la création de notre application.<br />
Pour cela, vous allez lancer WebMatrix. Dans la fenêtre de démariage rapide, vous allez sélectionner Modèles (Templates) parmi les différentes options qui sont proposées.</p>
<p><img src="http://blog.developpez.com/media/quickstart.PNG" width="821" height="546" alt="" /> </p>
<p>Dans la fenêtre qui va s’afficher, sélectionnez le modèle de projet Site de démarrage (Starter Site), renseignez le nom du site (<strong>WebMatrixCRUDApp</strong>) et cliquez enfin pour le bouton OK.</p>
<p><img src="http://blog.developpez.com/media/Templates_01.PNG" width="824" height="547" alt="" /> </p>
<p>Le modèle Site de démarrage contient par défaut une interface à onglet et des fonctionnalités d’authentification.</p>
<p>Une fois le projet créé, vous pouvez voir les éléments suivants dans la fenêtre d’exploration, en sélectionnant l’espace de travail Files dans la zone de sélection d’espace de travail.</p>
<p><img src="http://blog.developpez.com/media/solutionexplorer_01.PNG" width="192" height="315" alt="" /></p>
<p><strong>Installation d’Entity Framework</strong></p>
<p>Dans la boite d’outils, vous allez cliquer sur le bouton « Gallery » ayant le logo de NuGet. Dans la fenêtre des packages qui s’affichent par défaut, sélectionnez le package Entity Framework comme l’illustre l’image ci-dessous :</p>
<p><img src="http://blog.developpez.com/media/DownloadEntity.PNG" width="409" height="285" alt="" /></p>
<p>La fenêtre du gestionnaire de packages NuGet s’affiche avec les détails sur le package que vous souhaitez installer.<br />
Cliquez sur le bouton « Install » et acceptez les termes d’utilisation pour que NuGet procède au téléchargement et à l’installation d’Entity Framework dans votre application :</p>
<p><img src="http://blog.developpez.com/media/InstallEntityF.PNG" width="714" height="483" alt="" /> </p>
<p>Le fichier EntityFramework.dll sera alors ajouté dans le dossier bin de votre application et une référence à l’espace de nom System.Data.Entity sera automatiquement ajoutée au fichier Web.config.</p>
<p><strong>Définition du modèle objet</strong></p>
<p>Notre exemple simple portera sur une petite application pour la gestion du carnet d’adresses d’une entreprise. L’entreprise contient plusieurs organismes  et un employé peut travailler dans un ou plusieurs organismes.</p>
<p>Le schéma de la base de données que nous allons utiliser est donc le suivant :</p>
<p><img src="http://blog.developpez.com/media/DatabaseSchema.PNG" width="594" height="316" alt="" /> </p>
<p>De ce schéma, nous allons créer les différentes entités correspondantes. Chaque entité doit être définie comme une classe C# afin d’être compréhensible par Entity Framework.</p>
<p>Vous allez créer un nouveau dossier « App_code » en faisant un clic droit sur votre projet dans l’explorateur de solution et en cliquant sur « New Folder ».</p>
<p>Sélectionnez ce dossier et ajoutez-y un nouveau fichier C# en cliquant sur le bouton « New » de la boite d’outils et ensuite sur la commande « New File ». </p>
<p>Dans la fenêtre qui va s’afficher, sélectionnez le type de fichier Class(C#), renseignez le nom du fichier (Personne.cs)  et validez sur OK.</p>
<p>Ajoutez par la suite les lignes de code suivantes dans ce fichier pour définir  la classe Personne.</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> Personne<br />{<br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> PersonneId { get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Nom {get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Prenom {get; set;}<br /><br />}<br /></pre>
<p></div>
<p>Procédez de même pour le fichier Organisme.cs, dont la classe aura la définition suivante :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Organisme<br />{<br />   <br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Adresse {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br />}<br /></pre>
<p></div>
<p>Créez également la classe Affiliation qui aura la définition suivante :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Affiliation<br />{   <br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Fonction {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Email {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br />}<br /></pre>
<p></div>
<p>À ce stade, vous avez simplement défini des entités correspondantes au schéma de votre base de données. Cependant,  Entity Framework est incapable de définir les relations entre les tables Presonne et Affilialtion, ainsi qu’entre les tables Organisme et Affiliation.</p>
<p>Pour matérialiser cela, vous allez donc ajouter une propriété Personne et une propriété Organisme dans la classe Affiliation. La nouvelle définition de cette classe est la suivante :</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> Affiliation<br />{<br />   <br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> PersonneId { get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> OrganismeId { get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Fonction {get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Email {get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Telephone {get; set;}<br /><br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">virtual</span> Personne Personne {get; set;}<br />   <span style="color: #0000ff">public</span> <span style="color: #0000ff">virtual</span> Organisme Organisme {get; set;}<br />}<br /></pre>
<p></div>
<p>De même, pour matérialiser le fait qu’une Personne peut avoir plusieurs affiliations dans divers organismes et le fait qu’un organisme dispose de plusieurs personnes affiliées, vous allez ajouter également une propriété supplémentaire dans chacune de ces deux tables. </p>
<p>La nouvelle définition de la classe Personne sera donc la suivante :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Personne<br />{<br />    <br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Prenom {get; set;}<br /><br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br />}<br /></pre>
<p></div>
<p>Et celle de la classe Organisme sera la suivante : </p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> Organisme<br />{<br />   <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> OrganismeId { get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Nom {get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Adresse {get; set;}<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Telephone {get; set;}<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br /><br />}<br /></pre>
<p></div>
<p>Par défaut, lors de la génération de la base de données correspondante à votre modèle objet,  les champs string seront définis par Entity Framework Code First comme des colonnes nvarchar(4000). Pour limiter cette taille, vous allez utiliser l’attribut <strong>[MaxLengthAttribute()]</strong> de la classe DataAnnotation.</p>
<p>L’attribut <strong>[RequiredAttribute]</strong> de cette classe sera également utilisé pour définir les propriétés dont les valeurs sont obligatoires. [ScaffoldColumnAttribute] sera utilisé pour spécifier que la clé primaire doit être autoincrément. Enfin, vous allez définir l’attribut <strong>[KeyAttribute</strong>] pour spécifier les clés étrangères et les tables auxquelles ces clés sont liées.</p>
<p>Le code complet du fichier Personne.cs sera donc le suivant :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">using</span> System;<br /><span style="color: #0000ff;">using</span> System.Collections.Generic;<br /><span style="color: #0000ff;">using</span> System.ComponentModel.DataAnnotations;<br /><span style="color: #0000ff;">using</span> System.Web;<br /><br /><span style="color: #008000;">/// &lt;summary&gt;</span><br /><span style="color: #008000;">/// Summary description for ClassName</span><br /><span style="color: #008000;">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Personne<br />{<br />    [ScaffoldColumnAttribute(<span style="color: #0000ff;">false</span>)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Prenom {get; set;}<br /><br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br /><br />}<br /></pre>
<p></div>
<p>Celui du fichier Organisme.cs est le suivant :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">using</span> System;<br /><span style="color: #0000ff;">using</span> System.Collections.Generic;<br /><span style="color: #0000ff;">using</span> System.ComponentModel.DataAnnotations;<br /><span style="color: #0000ff;">using</span> System.Web;<br /><br /><span style="color: #008000;">/// &lt;summary&gt;</span><br /><span style="color: #008000;">/// Summary description for ClassName</span><br /><span style="color: #008000;">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Organisme<br />{<br />   [ScaffoldColumnAttribute(<span style="color: #0000ff;">false</span>)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Nom {get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Adresse {get; set;}<br />    [MaxLengthAttribute(50)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br /><br />     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> ICollection&lt;Affiliation&gt; Affiliation {get; set;}<br />}<br /></pre>
<p></div>
<p>Et enfin, la nouvelle définition du fichier Affiliation.cs est la suivante :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">using</span> System;<br /><span style="color: #0000ff;">using</span> System.Collections.Generic;<br /><span style="color: #0000ff;">using</span> System.ComponentModel.DataAnnotations;<br /><span style="color: #0000ff;">using</span> System.Web;<br /><br /><span style="color: #008000;">/// &lt;summary&gt;</span><br /><span style="color: #008000;">/// Summary description for ClassName</span><br /><span style="color: #008000;">/// &lt;/summary&gt;</span><br /><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">partial</span> <span style="color: #0000ff;">class</span> Affiliation<br />{   <br />    [KeyAttribute, ForeignKey(<span style="color: #006080;">"Personne"</span>), Column(Order = 0)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> PersonneId { get; set;}<br />    [KeyAttribute, ForeignKey(<span style="color: #006080;">"Organisme"</span>), Column(Order = 1)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> OrganismeId { get; set;}<br />    [MaxLengthAttribute(50)]<br />    [RequiredAttribute]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Fonction {get; set;}<br />    [MaxLengthAttribute(50)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Email {get; set;}<br />    [MaxLengthAttribute(50)]<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Telephone {get; set;}<br /><br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> Personne Personne {get; set;}<br />    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">virtual</span> Organisme Organisme {get; set;}<br />}</pre>
<p></div>
<p>La troisième partie portera sur la création du DbContext, de la base de données à partir du modèle objet avec EF Code First et enfin la définition des différentes classes Repository qui seront utilisées.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
