<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>#Zied</title>
  <link rel="alternate" type="text/html" href="http://www.zied.fr/" />
  <link rel="self" href="http://www.zied.fr/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2010-05-06T21:25:54.9794423+02:00</updated>
  <author>
    <name>Zied Nemili</name>
  </author>
  <subtitle>the .Net Hammamlif man!</subtitle>
  <id>http://www.zied.fr/</id>
  <generator uri="http://www.dasblog.net" version="2.0.7180.0">DasBlog</generator>
  <entry>
    <title>KIN : Les premiers Windows Phones avec Windows Mobile 7 voient le jour</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/05/06/KINLesPremiersWindowsPhonesAvecWindowsMobile7VoientLeJour.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,ac886571-273d-43a4-b3b2-8dec9b04c1d9.aspx</id>
    <published>2010-05-06T21:25:54.9794423+02:00</published>
    <updated>2010-05-06T21:25:54.9794423+02:00</updated>
    <category term="Windows mobile" label="Windows mobile" scheme="http://www.zied.fr/CategoryView,category,Windows%2Bmobile.aspx" />
    <category term="Windows phone" label="Windows phone" scheme="http://www.zied.fr/CategoryView,category,Windows%2Bphone.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Aujourd’hui Microsoft, Sharp, Verizon Wireless et Vodafone ont dévoilé KIN, la première
gamme de Windows Phone commercialisés qui embarquent le tant attendu Windows Mobile
7. Cette gamme est composée de deux Windows Phones : “KIN ONE” et “KIN TOW”. Avec
leurs formes rondelettes et fun et leur clavier confortables ces deux smartphones
vont tenter de séduire un public jeune en leur proposant de vivre leur quotidien en
toute simplicité. Sans rien installer de plus, ces deux Windows phones vont permettre
à leurs utilisateurs de rester connecté aux différents réseaux sociaux, d’écouter
leurs morceaux de musique préférés, prendre des photos qu’ils pourront par ailleurs
partager très simplement avec leurs amis, envoyer des emails, surfer sur internet,
…
</p>
        <p>
Pour voir un peu à quoi ça ressemble vous pouvez consulter <a href="http://www.kin.com/" target="_blank">le
site KIN</a></p>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=ac886571-273d-43a4-b3b2-8dec9b04c1d9" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Personnaliser les colonnes d'un DataGrid en Silverlight : 3&amp;egrave;me partie, utilisation du ValueConverter</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/03/30/PersonnaliserLesColonnesDunDataGridEnSilverlight3egravemePartieUtilisationDuValueConverter.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,65a066a5-5c90-4c9d-bceb-2f3d72392f63.aspx</id>
    <published>2010-03-30T22:52:35.1847007+02:00</published>
    <updated>2010-03-30T22:52:35.1847007+02:00</updated>
    <category term="c#" label="c#" scheme="http://www.zied.fr/CategoryView,category,c%23.aspx" />
    <category term="Silverlight" label="Silverlight" scheme="http://www.zied.fr/CategoryView,category,Silverlight.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dans les deux première parties de cette série d’articles nous avons utilisé une DataGrid
pour afficher des données provenant d’un service WCF en utilisant l’option de génération
automatique de colonnes. Ensuite nous avons personnalisé ces colonnes <a href="http://www.zied.fr/2010/01/17/PersonnaliserLesColonnesDunDataGridEnSilverlight1egraverePartie.aspx" target="_blank">dans
un premier temps à l’aide du DataGridTextColumn et du DataGridCheckBoxColumn</a>,
et <a href="http://www.zied.fr/2010/02/10/PersonnaliserLesColonnesDunDataGridEnSilverlight2egraverePartie.aspx" target="_blank">dans
un deuxième temps avec le DataGridTemplateColumn</a>. Voici le résultat obtenu :
</p>
        <p>
          <img src="http://www.zied.fr/ct.ashx?id=bcf43fae-772d-4ab8-a255-3875a024b07c&amp;url=http%3a%2f%2fwww.zied.fr%2fcontent%2fbinary%2fWindowsLiveWriter%2fPersonnaliserlescolonnesdunDataGridenSil_12656%2fimage_11.png" />
        </p>
        <p>
Nous allons maintenant ajouter l’affichage de la date de réalisation de la tâche mais
comme la date est de type DateTime lorsqu’on va la binder dans une colonne de type
Text, nous allons voir la date et heure complète alors que ce qui nous intéresse c’est
uniquement la date. Dans cet article nous allons donc utiliser un ValueConverter pour
afficher la date au format attendu.
</p>
        <p>
Pour suivre cet exemple vous pouvez télécharger <a href="http://www.zied.fr/2010/02/10/PersonnaliserLesColonnesDunDataGridEnSilverlight2egraverePartie.aspx" target="_blank">les
sources joints à cet article</a>.
</p>
        <p>
Commençons d’abord par rajouter l’affichage de la date, dans le projet TasksManager.View
(l’application Silverlight), répertoire Model, ouvrez la classe Task et rajouter la
propriété date de réalisation comme suit :
</p>
        <pre class="csharpcode">
          <span class="kwrd">public</span> DateTime? RealizationDate
{ get; set; }</pre>
        <p>
Dans le même projet, le répertoire ViewModel ouvrez la classe TasksViewModel et localisez
la méthode taskServiceClient_GetListCompleted et rajoutez la ligne d’affectation de
la date de réalisation comme suit :
</p>
        <pre class="csharpcode">
          <span class="kwrd">void</span> taskServiceClient_GetListCompleted(<span class="kwrd">object</span> sender,
TasksManager.View.TasksService.GetListCompletedEventArgs e) { List&lt;Task&gt; resultTasks
= <span class="kwrd">new</span> List&lt;Task&gt;(); <span class="kwrd">foreach</span> (TasksService.Task
t <span class="kwrd">in</span> e.Result) { Task mt = <span class="kwrd">new</span> Task();
mt.Id = t.id; mt.Name = t.name; <font color="#ff0000">mt.RealizationDate = t.realizationDate;</font><span class="kwrd">if</span> (t.realized.HasValue)
mt.Realized = t.realized.Value; resultTasks.Add(mt); } <span class="kwrd">this</span>.Tasks
= resultTasks; }</pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Et enfin, dans le même projet, répertoire Views, ouvrez le fichier Tasks.xaml et dans
&lt;Data:DataGrid.Columns&gt;, rajoutez la colonne suivante :
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">Data:DataGridTextColumn</span>
          <span class="attr">Binding</span>
          <span class="kwrd">="{Binding
RealizationDate}"</span>
          <span class="attr">Header</span>
          <span class="kwrd">="Date
de réalisation"</span>
          <span class="kwrd">&gt;&lt;/</span>
          <span class="html">Data:DataGridTextColumn</span>
          <span class="kwrd">&gt;</span>
        </pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Lancez maintenant le projet, voici ce que vous devriez obtenir cela :
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/image_thumb.png" width="640" height="204" />
          </a>
        </p>
        <p>
La date de réalisation s’affiche pour les tâches pour les quelles la date est renseignée. 
</p>
        <p>
Nous voyons bien, comme prévu, que la date d’affiche avec un format long. Ceci parce
que le ToString() d’une date convertit la date en chaîne de caractère avec ce format.
Nous allons maintenant mettre en place un converter pour afficher uniquement la date.
</p>
        <p>
Dans le projet TasksManager.View, répertoire Views, ajoutez un nouveau répertoire
et appelez le “Converters”. Dans ce répertoire ajoutez une nouvelle classe et nommez
la “ShortDateFormatConverter”. Ensuite, implémentez l’interface IValueConverter en
ajoutant l’espace de noms System.Windows.Data
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/image_thumb_1.png" width="644" height="322" />
          </a>
        </p>
        <p>
Pour implémenter l’interface IValueConverter nous devons définir deux méthodes :
</p>
        <p>
- La méthode Convert : qui convertit l’objet à binder vers l’objet que nous voulons
afficher. Dans notre cas cette méthode prend en paramètre la date de réalisation de
type DateTime et nous allons faire en sorte qu’elle renvoie une chaine de caractère
représentant la date au format court.
</p>
        <p>
- La méthode ConvertBack : qui fait le chemin inverse, c’est à dire qu’elle prend
en paramètre la chaine de caractère affichée et représentant la date au format court
pour la convertir au format d’origine (dans notre cas DateTime). Cette méthode est
utile lorsqu’on met en place un Binding TwoWay, mais dans notre cas nous n’allons
pas l’implémenter parce que notre but est uniquement l’affichage.
</p>
        <p>
Voici le code de la classe ShortDateFormatConverter
</p>
        <pre class="csharpcode">
          <span class="kwrd">public</span>
          <span class="kwrd">class</span> ShortDateFormatConverter
: IValueConverter { <span class="kwrd">public</span><span class="kwrd">object</span> Convert(<span class="kwrd">object</span><span class="kwrd">value</span>,
Type targetType, <span class="kwrd">object</span> parameter, System.Globalization.CultureInfo
culture) { DateTime? date = <span class="kwrd">value</span><span class="kwrd">as</span> DateTime?; <span class="kwrd">if</span> (date
!= <span class="kwrd">null</span>) <span class="kwrd">return</span> date.Value.ToShortDateString(); <span class="kwrd">return</span> date;
} <span class="kwrd">public</span><span class="kwrd">object</span> ConvertBack(<span class="kwrd">object</span><span class="kwrd">value</span>,
Type targetType, <span class="kwrd">object</span> parameter, System.Globalization.CultureInfo
culture) { <span class="kwrd">throw</span><span class="kwrd">new</span> NotImplementedException();
} }</pre>
        <p>
Pour utiliser ce converter dans notre vue nous devons tout d’abord l’enregistrer comme
ressource dans notre UserControl, ouvrez le fichier Tasks.xaml et placez vous juste
après la déclaration du UserControl
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">UserControl.Resources</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">Converters:ShortDateFormatConverter</span>
          <span class="attr">x:Key</span>
          <span class="kwrd">="ShortDateFormatter"</span>
          <span class="kwrd">&gt;&lt;/</span>
          <span class="html">Converters:ShortDateFormatConverter</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;/</span>
          <span class="html">UserControl.Resources</span>
          <span class="kwrd">&gt;</span>
        </pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Et enfin remplacez la ligne que nous avons ajouté au tout début de cet article 
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">Data:DataGridTextColumn</span>
          <span class="attr">Binding</span>
          <span class="kwrd">="{Binding
RealizationDate}"</span>
          <span class="attr">Header</span>
          <span class="kwrd">="Date
de réalisation"</span>
          <span class="kwrd">&gt;&lt;/</span>
          <span class="html">Data:DataGridTextColumn</span>
          <span class="kwrd">&gt;</span>
        </pre>
        <p>
Par celle – ci:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">Data:DataGridTextColumn</span>
          <span class="attr">Binding</span>
          <span class="kwrd">="{Binding
RealizationDate, Converter={StaticResource ShortDateFormatter}}"</span>
          <span class="attr">Header</span>
          <span class="kwrd">="Date
de réalisation"</span>
          <span class="kwrd">&gt;&lt;/</span>
          <span class="html">Data:DataGridTextColumn</span>
          <span class="kwrd">&gt;</span>
        </pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Lancez maintenant votre application, vous devriez avoir ce résultat :
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/image_6.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/image_thumb_2.png" width="644" height="187" />
          </a>
        </p>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:F60BB8FA-6F02-4999-8F5E-9DD4E92C4DA7:1f894a37-5603-463c-ad54-bcacc1b5181b" class="wlWriterEditableSmartContent">
          <div>
            <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/PersonnaliserlescolonnesdunDataGridenSil_F015/PersonnaliserColonnesDataGridSilverlight3.zip" target="_blank">Code
source de l'exemple</a>
          </div>
        </div>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=65a066a5-5c90-4c9d-bceb-2f3d72392f63" />
      </div>
    </content>
  </entry>
  <entry>
    <title>SqlFunctions dans Entity Framework 4</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/03/19/SqlFunctionsDansEntityFramework4.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,43be0860-4f7a-49bb-a50c-1795bcb43078.aspx</id>
    <published>2010-03-19T22:29:31.3793892+01:00</published>
    <updated>2010-03-19T22:29:31.3793892+01:00</updated>
    <category term="Acc&amp;#232;s aux donn&amp;#233;es" label="Acc&amp;#232;s aux donn&amp;#233;es" scheme="http://www.zied.fr/CategoryView,category,Acc%c3%a8s%2Baux%2Bdonn%c3%a9es.aspx" />
    <category term="c#" label="c#" scheme="http://www.zied.fr/CategoryView,category,c%23.aspx" />
    <category term="Entity framework" label="Entity framework" scheme="http://www.zied.fr/CategoryView,category,Entity%2Bframework.aspx" />
    <category term="linq" label="linq" scheme="http://www.zied.fr/CategoryView,category,linq.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dans les versions précédentes d’Entity Framework, faire un calcul de différence entre
deux dates avec linq to entities était assez laborieux, les fonctions c# n’étaient
pas prise en compte dans les requêtes linq to entities et nous étions obligé soit
de passer par une colonne calculée au sein de la Base de données soit modifier les
fichiers de mapping pour écrire la requête sql à la main et utiliser la fonction DATEDIFF
de SQL Server.
</p>
        <p>
Avec Entity Framework 4 et l’apparition de la classe SqlFunctions, tout ça c’est de
l’histoire ancienne. Cette classe contient un bon nombre de fonctions Sql Server qui
peuvent être utilisées directement dans nos requêtes Linq To Entities et qui vont
être traduites vers les fonctions SQL dans un contexte de requête à la BDD. Ces fonctions
sont exposées directement par SQL Server et sont donc propres au Provider Sql Server.
Parmis ces fonctions nous trouvons le DateDiff qui va nous permettre de calculer la
différence entre 2 dates.
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/SqlfunctionsdansEntityFramework4_AD75/image_2.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/SqlfunctionsdansEntityFramework4_AD75/image_thumb.png" width="644" height="286" />
          </a>
        </p>
        <p>
Soit cette requête linq to entites :
</p>
        <pre class="csharpcode">var requete = from s <span class="kwrd">in</span> context.Person
select <span class="kwrd">new</span> { Nom = s.FirstName + <span class="str">"
"</span> + s.LastName, s.BirthDate, Age = System.Data.Objects.SqlClient.SqlFunctions.DateDiff(<span class="str">"year"</span>,
s.BirthDate, DateTime.Now) };</pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Du côté de profiler, voici la requête générée : 
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/SqlfunctionsdansEntityFramework4_AD75/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/SqlfunctionsdansEntityFramework4_AD75/image_thumb_1.png" width="644" height="381" />
          </a>
        </p>
        <p>
Nous remarquons que notre fonction DATEDIFF a été traduite littéralement. 
</p>
        <p>
Faisons maintenant un petit tour sur Reflector, voici ce que nous pouvons trouver
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/SqlfunctionsdansEntityFramework4_AD75/image_8.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/SqlfunctionsdansEntityFramework4_AD75/image_thumb_3.png" width="644" height="332" />
          </a>
        </p>
        <p>
En effet, cette fonction est une fonction Sql Server mappée tout simplement. Donc
en ce qui concerne les SqlFunctions, il vaut mieux se référer directement à la documentation
Transact – SQL.
</p>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=43be0860-4f7a-49bb-a50c-1795bcb43078" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Exposer les POCO Entity Framework 4 via un service WCF, r&amp;eacute;solution du probl&amp;egrave;me de r&amp;eacute;f&amp;eacute;rence circulaire : 3&amp;egrave;me partie</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/03/15/ExposerLesPOCOEntityFramework4ViaUnServiceWCFReacutesolutionDuProblegravemeDeReacutefeacuterenceCirculaire3egravemePartie.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,fd51cb80-8fa5-472b-8180-f5bc9792a2fe.aspx</id>
    <published>2010-03-15T20:13:00+01:00</published>
    <updated>2010-03-15T21:13:36.2439695+01:00</updated>
    <category term="Acc&amp;#232;s aux donn&amp;#233;es" label="Acc&amp;#232;s aux donn&amp;#233;es" scheme="http://www.zied.fr/CategoryView,category,Acc%c3%a8s%2Baux%2Bdonn%c3%a9es.aspx" />
    <category term="Entity framework" label="Entity framework" scheme="http://www.zied.fr/CategoryView,category,Entity%2Bframework.aspx" />
    <category term="POCO" label="POCO" scheme="http://www.zied.fr/CategoryView,category,POCO.aspx" />
    <category term="WCF" label="WCF" scheme="http://www.zied.fr/CategoryView,category,WCF.aspx" />
    <category term="Web services" label="Web services" scheme="http://www.zied.fr/CategoryView,category,Web%2Bservices.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Le problème de référence circulaire n’est pas propre à Entity Framework mais plutôt
un problème de sérialisation WCF, dans cet article nous allons expliquer le problème
et proposer une solution.
</p>
        <p>
Soit le modèle edmx suivant :
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/ExposerlesPOCOEntityFrameworkviaunservic_143B8/image_4.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/ExposerlesPOCOEntityFrameworkviaunservic_143B8/image_thumb_1.png" width="629" height="484" />
          </a>
        </p>
        <p>
Ce modèle a été très bien conçu et reflète bien la réalité du métier, par contre pour
le développeur ce n’est pas vraiment la joie parce que s’il a envie de savoir à quel
StudentGroup appartient un étudiant (Person_Student) il devra passer par 4 tables
alors que c’est censé être l’opération métier la plus élémentaire. Passer par ces
4 tables est non seulement pénible pour le développeur mais en plus catastrophique
au niveau perf pour au final une opération très simple. Après une discussion houleuse
entre le Développeur et le DBA, le DBA accepte (une fois n’est pas coutume:)) d’ajouter
un raccourci matérialisé en une table de lien entre Student et StudentGroup permettant
de déterminer directement l’appartenance d’un étudiant à un groupe d’étudiants. Voici
ce qu’est devenu le modèle :
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/ExposerlesPOCOEntityFrameworkviaunservic_143B8/image_6.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/ExposerlesPOCOEntityFrameworkviaunservic_143B8/image_thumb_2.png" width="644" height="429" />
          </a>
        </p>
        <p>
Si le DBA était retissant au rajout de ce raccourci c’est à cause de ce cycle (entouré
en rouge) introduit au sein du modèle. Ce cycle est sans conteste une mauvaise pratique
en design mais dans quelques cas ça s’avère bien pratique. 
</p>
        <p>
Tout content (juste parce qu’il a eu gain de cause:)), le développeur se met à développer
son service WCF en créant une méthode qui renvoie un étudiant en embarquant quelques
données liées. Voici le corps de la méthode :
</p>
        <pre class="csharpcode">
          <span class="kwrd">public</span> Person_Student GetById(<span class="kwrd">int</span> id)
{ SuiviScolaireEntities context = <span class="kwrd">new</span> SuiviScolaireEntities(); <span class="kwrd">return</span> context.Person_Student.Include(<span class="str">"Pass"</span>)
.Include(<span class="str">"Pass.Exam"</span>) .Include(<span class="str">"Pass.Exam.Teach"</span>)
.Where(s =&gt; s.PersonId == id) .FirstOrDefault&lt;Person_Student&gt;(); }</pre>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Il crée ensuite la partie client pour appeler le service et en exécutant il obtient
l’erreur suivante :
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/ExposerlesPOCOEntityFrameworkviaunservic_143B8/image_8.png">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/ExposerlesPOCOEntityFrameworkviaunservic_143B8/image_thumb_3.png" width="644" height="321" />
          </a>
        </p>
        <p>
        </p>
        <p>
Bon je vous l’accorde ce n’est pas très explicite comme erreur, pour y voir plus clair
nous allons <a href="http://www.zied.fr/2010/03/07/DebuggerUnServiceWCF.aspx" target="_blank">activer
la trace WCF</a>, voici la vrai erreur qui se cache derrière ce message :
</p>
        <p>
          <strong>There was an error while trying to serialize parameter </strong>
          <a href="http://tempuri.org/:GetStudentByIdResult">
            <strong>http://tempuri.org/:GetStudentByIdResult</strong>
          </a>
          <strong>.
The InnerException message was 'Object graph for type 'xxxxxxx' contains cycles and
cannot be serialized if reference tracking is disabled.'.  Please see InnerException
for more details.</strong>
        </p>
        <p>
L’erreur dit que le modèle comporte un cycle et qu’il ne peut être sérialisé via WCF.
Le développeur la ramène moins d’un coup mais se dit qu’il faut absolument résoudre
ce problème pour ne pas avoir l’air con et que le DBA lui dise : je t’avais dit que
ce n’est pas bien! 
</p>
        <p>
          <strong>Analyse du problème</strong>
        </p>
        <p>
Le problème est que le DataContractSerializer va vouloir sérialiser explicitement
les objets à renvoyer au client au lieu de travailler avec des références, supposons
que l’on ai ce modèle :
</p>
        <pre class="csharpcode">
          <span class="kwrd">public</span>
          <span class="kwrd">class</span> Person
{ <span class="kwrd">public</span><span class="kwrd">int</span> Id { get; set; } <span class="kwrd">public</span><span class="kwrd">int</span> FirstName
{ get; set; } <span class="kwrd">public</span><span class="kwrd">int</span> LastName
{ get; set; } <span class="kwrd">public</span> List&lt;Person&gt; Enfants { get; set;
} }</pre>
        <p>
Et que j’ai une List&lt;Person&gt; dans laquelle j’ai inséré des données de la manière
suivante : 
</p>
        <pre class="csharpcode">Person pEnfant1 = <span class="kwrd">new</span> Person { Id
= 1, FirstName = <span class="str">"Thierry"</span>, LastName = <span class="str">"BOB"</span> }; <span class="rem">//Enfant</span> Person
pEnfant2 = <span class="kwrd">new</span> Person { Id = 2, FirstName = <span class="str">"Marcus"</span>,
LastName = <span class="str">"TIBH"</span> }; <span class="rem">//Enfant</span> Person
pEnfant3 = <span class="kwrd">new</span> Person { Id = 3, FirstName = <span class="str">"Adrien"</span>,
LastName = <span class="str">"MOLBE"</span> }; <span class="rem">//Enfant</span> Person
pEnfant4 = <span class="kwrd">new</span> Person { Id = 4, FirstName = <span class="str">"Yam"</span>,
LastName = <span class="str">"BOB"</span> }; <span class="rem">//Enfant</span> Person
pParent1 = <span class="kwrd">new</span> Person { Id = 5, FirstName = <span class="str">"Julien"</span>,
LastName = <span class="str">"BOB"</span>, Enfants = <span class="kwrd">new</span> List&lt;Person&gt;
{ pEnfant1, pEnfant4 } }; <span class="rem">//Parent</span> Person pParent2 = <span class="kwrd">new</span> Person
{ Id = 6, FirstName = <span class="str">"Gilian"</span>, LastName = <span class="str">"TIBH"</span>,
Enfants = <span class="kwrd">new</span> List&lt;Person&gt; { pEnfant2 } }; //Parent</pre>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Par défaut, le DataContractSerializer instancié par WCF sérialise les données de la
manière suivante :
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">ArrayOfPerson</span>
          <span class="attr">xmlns</span>
          <span class="kwrd">="http://schemas.datacontract.org/2004/07/ConsoleApplication1"</span>
          <span class="attr">xmlns:i</span>
          <span class="kwrd">="http://www.w3.org/2001/XMLSchema-instance"</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">Person</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">Enfants</span>
          <span class="attr">i:nil</span>
          <span class="kwrd">="true"</span>
          <span class="kwrd">/&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">FirstName</span>
          <span class="kwrd">&gt;</span>Thierry<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>1<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Marcus<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>2<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>TIBH<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Adrien<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>3<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>MOLBE<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Yam<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>4<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Thierry<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>1<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Yam<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>4<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Julien<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>5<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Marcus<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>2<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>TIBH<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Gilian<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>6<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>TIBH<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">ArrayOfPerson</span><span class="kwrd">&gt;</span></pre>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Remarquez dans ce flux XML généré par le DataContractSerializer que les personnes
peuvent se répétées plusieurs fois dans le flux et que leur description entière est
reprise à chaque fois qu’elles apparaissent. Marcus TIBH apparaît dans le flux 2 fois
: Une fois comme “Person” sans enfants et ses informations sont reprises complètement
en tant que "Enfant” de Gilian TIBH.
</p>
        <p>
En effet, par défaut, WCF instancie le DataContractSerializer avec la propriété preserveObjectReferences
= false. Cette propriété permet de spécifier de ne pas préserver les références d’objets
lors de la sérialisation et du coup répéter à chaque fois entièrement les données. 
</p>
        <p>
          <strong>WCF n’autorise pas les références circulaires avec ce mode de sérialisation
et l’attribut preserveObjectReferences = false.</strong>
        </p>
        <p>
          <strong>1ère Solution</strong>
        </p>
        <p>
La première solution est décrite dans <a href="http://blogs.msdn.com/sowmy/archive/2006/03/26/preserving-object-reference-in-wcf.aspx" target="_blank">le
blog de sowmy</a> et qui consiste à modifier le fonctionnement par défaut de WCF en
instanciant le DataContractSerializer avec le preserveObjectReferences = true. Ceci
est possible en héritant de DataContractSerializerOperationBehavior et en surchargeant
sa méthode CreateSerializer qui renvoie le Serializer au moteur WCF. Nous pourrons
par la suite faire de notre classe un attribut avec lequel nous allons décorer toutes
les méthodes qui vont avoir besoin de ce mode de fonctionnement.
</p>
        <p>
          <strong>2ème solution</strong>
        </p>
        <p>
La deuxième méthode consiste à définir la propriété IsReference à True sur les classes
qui vont être sérialisés de cette manière :
</p>
        <pre class="csharpcode">[DataContract(IsReference=<span class="kwrd">true</span>)] <span class="kwrd">public</span><span class="kwrd">class</span> Person
{ [DataMember] <span class="kwrd">public</span><span class="kwrd">int</span> Id {
get; set; } [DataMember] <span class="kwrd">public</span><span class="kwrd">string</span> FirstName
{ get; set; } [DataMember] <span class="kwrd">public</span><span class="kwrd">string</span> LastName
{ get; set; } [DataMember] <span class="kwrd">public</span> List&lt;Person&gt; Enfants
{ get; set; } }</pre>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
De cette manière le DataContractSerializer va travailler avec les références à chaque
fois qu’il s’agit de sérialiser un objet du type de cette classe.
</p>
        <p>
Pour ces 2 méthodes, voici le XML résultant :
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">ArrayOfPerson</span>
          <span class="attr">xmlns</span>
          <span class="kwrd">="http://schemas.datacontract.org/2004/07/ConsoleApplication1"</span>
          <span class="attr">xmlns:i</span>
          <span class="kwrd">="http://www.w3.org/2001/XMLSchema-instance"</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">Person</span>
          <span class="attr">z:Id</span>
          <span class="kwrd">="i1"</span>
          <span class="attr">xmlns:z</span>
          <span class="kwrd">="http://schemas.microsoft.com/2003/10/Serialization/"</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">Enfants</span>
          <span class="attr">i:nil</span>
          <span class="kwrd">="true"</span>
          <span class="kwrd">/&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">FirstName</span>
          <span class="kwrd">&gt;</span>Thierry<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>1<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Id</span><span class="kwrd">="i2"</span><span class="attr">xmlns:z</span><span class="kwrd">="http://schemas.microsoft.com/2003/10/Serialization/"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Marcus<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>2<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>TIBH<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Id</span><span class="kwrd">="i3"</span><span class="attr">xmlns:z</span><span class="kwrd">="http://schemas.microsoft.com/2003/10/Serialization/"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Adrien<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>3<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>MOLBE<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Id</span><span class="kwrd">="i4"</span><span class="attr">xmlns:z</span><span class="kwrd">="http://schemas.microsoft.com/2003/10/Serialization/"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="attr">i:nil</span><span class="kwrd">="true"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Yam<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>4<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Id</span><span class="kwrd">="i5"</span><span class="attr">xmlns:z</span><span class="kwrd">="http://schemas.microsoft.com/2003/10/Serialization/"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Ref</span><span class="kwrd">="i1"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Ref</span><span class="kwrd">="i4"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Julien<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>5<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>BOB<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Id</span><span class="kwrd">="i6"</span><span class="attr">xmlns:z</span><span class="kwrd">="http://schemas.microsoft.com/2003/10/Serialization/"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Person</span><span class="attr">z:Ref</span><span class="kwrd">="i2"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">Enfants</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">FirstName</span><span class="kwrd">&gt;</span>Gilian<span class="kwrd">&lt;/</span><span class="html">FirstName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">Id</span><span class="kwrd">&gt;</span>6<span class="kwrd">&lt;/</span><span class="html">Id</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">LastName</span><span class="kwrd">&gt;</span>TIBH<span class="kwrd">&lt;/</span><span class="html">LastName</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">Person</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">ArrayOfPerson</span><span class="kwrd">&gt;</span></pre>
        <p>
Vous avez certainement remarqué les attributs z:Id et z:ref qui permettent de ne plus
reprendre toutes les données d’une instance et de la référencer via son Id. <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style></p>
        <p>
Enjoy ;)
</p>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=fd51cb80-8fa5-472b-8180-f5bc9792a2fe" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Webcast des Techdays 2010 en ligne</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/03/11/WebcastDesTechdays2010EnLigne.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,92b03653-cae7-472a-9da7-d68c8ecca7e3.aspx</id>
    <published>2010-03-12T00:11:06.4614411+01:00</published>
    <updated>2010-03-12T00:11:06.4614411+01:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
ça y est!!! tous ceux qui n’ont pas eu la chance d’être au Palais des congrès du 8
au 10 février vont pouvoir prendre leur revanche puisque les webcast de toutes les
sessions des Techdays 2010 sont en ligne depuis ce matin <a href="http://www.microsoft.com/france/vision/mstechdays10/Default.aspx" target="_blank">à
cette adresse</a>. Je vous conseille bien évidemment celle que j’ai animé avec Arnaud
AUROUX intitulée <a href="http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=0853a19f-5225-4d0e-9eab-78a080c87432" target="_blank"><strong>Silverlight
4 : Cas pratique du mode déconnecté</strong></a>. Vous trouverez attaché à cet article
la solution que nous avons développé pendant la session. 
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:F60BB8FA-6F02-4999-8F5E-9DD4E92C4DA7:c253e516-7e5b-40cb-80da-ee639d92666e" class="wlWriterEditableSmartContent">
          <div>
            <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/WebcastdesTechdays2010enligne_2A/SilverlightSync_1.zip" target="_blank">SilverlightSync.zip</a>
          </div>
        </div>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=92b03653-cae7-472a-9da7-d68c8ecca7e3" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Debugger un service WCF</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/03/07/DebuggerUnServiceWCF.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,0c69c393-952d-4a30-8181-142879c446a5.aspx</id>
    <published>2010-03-07T23:02:06.4474741+01:00</published>
    <updated>2010-03-07T23:02:06.4474741+01:00</updated>
    <category term="Debug" label="Debug" scheme="http://www.zied.fr/CategoryView,category,Debug.aspx" />
    <category term="WCF" label="WCF" scheme="http://www.zied.fr/CategoryView,category,WCF.aspx" />
    <category term="Web services" label="Web services" scheme="http://www.zied.fr/CategoryView,category,Web%2Bservices.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Nous pouvons debugger notre code au sein d’un service WCF de la même manière que tout
autre code .NET, en définissant des points d’arrêts au niveau du code que  nous
voulons débugger et si nous utilisons le serveur web IIS nous devons alors nous attacher
au processus de ce dernier. Mais il arrive que notre code s’exécute bien et ne lève
aucune exception alors que côté client nous récupérons une erreur qui ressemble à
ça :
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/DebuggerunserviceWCF_14413/image_2.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/DebuggerunserviceWCF_14413/image_thumb.png" width="644" height="229" />
          </a>
        </p>
        <p>
          <strong>“The remote server returned an error: NotFound” </strong>pas très explicite
comme erreur surtout lorsque vous savez que le code du service WCF a bien été atteint
et qu’il s’est bien exécuté sans problème. Le problème s’est donc passé au sein de
WCF après l’exécution de votre code du service. Pour avoir une erreur plus explicite
et comprendre ce qui se passe réellement il suffit d’activer le tracing côté WCF en
ajoutant cette entrée dans le web.config
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">system.diagnostics</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">sources</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">source</span>
          <span class="attr">name</span>
          <span class="kwrd">="System.ServiceModel"</span>
          <span class="attr">switchValue</span>
          <span class="kwrd">="Information,
ActivityTracing"</span>
          <span class="attr">propagateActivity</span>
          <span class="kwrd">="true"</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">listeners</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">add</span>
          <span class="attr">name</span>
          <span class="kwrd">="WCFListener"</span>
          <span class="attr">type</span>
          <span class="kwrd">="System.Diagnostics.XmlWriterTraceListener"</span>
          <span class="attr">initializeData</span>= <span class="kwrd">"c:\wcflog\WCFTraces.svclog"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">listeners</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">source</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">sources</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">system.diagnostics</span><span class="kwrd">&gt;</span></pre>
        <p>
Après un nouvel appel de votre service, rendez vous au répertoire c:\wcflog et double
cliquez sur le fichier WCFTraces.svclog, vous allez pouvoir découvrir la vraie exception
</p>
        <p>
          <a href="http://www.zied.fr/content/binary/WindowsLiveWriter/DebuggerunserviceWCF_14413/image_4.png">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.zied.fr/content/binary/WindowsLiveWriter/DebuggerunserviceWCF_14413/image_thumb_1.png" width="1028" height="444" />
          </a>
          <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        </p>
        <p>
D’un coup, tout devient plus clair, dans mon cas j’ai un cycle dans mes classes.
</p>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=0c69c393-952d-4a30-8181-142879c446a5" />
      </div>
    </content>
  </entry>
  <entry>
    <title>Exposer les POCO Entity Framework via un service WCF : 2&amp;egrave;me partie</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2010/03/04/ExposerLesPOCOEntityFrameworkViaUnServiceWCF2egravemePartie.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,05dd6c52-09a2-43c9-96bf-51bd4bbee471.aspx</id>
    <published>2010-03-04T23:26:05.1456072+01:00</published>
    <updated>2010-03-04T23:30:40.9903855+01:00</updated>
    <category term="Entity framework" label="Entity framework" scheme="http://www.zied.fr/CategoryView,category,Entity%2Bframework.aspx" />
    <category term="POCO" label="POCO" scheme="http://www.zied.fr/CategoryView,category,POCO.aspx" />
    <category term="T4" label="T4" scheme="http://www.zied.fr/CategoryView,category,T4.aspx" />
    <category term="WCF" label="WCF" scheme="http://www.zied.fr/CategoryView,category,WCF.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
Dans <a href="http://www.zied.fr/2010/02/28/ExposerLesPOCOEntityFrameworkViaUnServiceWCF.aspx" target="_blank">la
première partie de cet article</a> nous avons vu qu’Entity Framework 4 génère des
Proxys qui héritent de nos classes POCO afin de leur ajouter des facultés de “Change
Tracking” et de “Lazy loading” et nous renvoyait ces proxys. Nous avons vu que ces
proxys posaient un problème lorsque nous avons voulu les sérialiser pour les exposer
via un service WCF et nous avons contourné ce problème en mappant ce proxy en notre
type original pendant la phase de sérialisation, de cette manière nous travaillons
avec des POCO en bénéficiant de tous les apports d’Entity Framework comme le “Tracking”
ou encore le “Lazy Loading” qui ne sont sincèrement pas un luxe. 
</p>
        <p>
Cette idée est néanmoins un “Work around” et j’ai tout de suite vu ces limites lorsque
j’ai essayé de renvoyer un objet avec des entités liées =&gt; retour à la case départ
problème de dé sérialisation … Il existe un autre moyen de travailler avec Entity
Framework et des POCO que nous allons illustrer dans cet article.
</p>
        <p>
En effet, nous pouvons choisir de dire au context que je ne veux pas qu’il génère
des proxys de cette manière 
</p>
        <pre class="csharpcode">context.ContextOptions.ProxyCreationEnabled = <span class="kwrd">false</span>;</pre>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Mais dans ce cas il faut assumer ces responsabilités :) Entity Framework ne fait plus
de Tracking de changement sur les entités ni de Lazy Loading, les entités doivent
donc accomplir ces fonctionnalités toutes seules, et c’est qui qui s’y colle? Bien
évidemment ce n’est pas nous :). Je ne sais pas si vous vous en souvenez mais nous
avons parlé <a href="http://www.zied.fr/2010/02/20/EntityFramework4EtLeSupportDesPOCOs.aspx" target="_blank">dans
cet article</a> d’un Template T4 fournit par l’équipe ADO.NET qui génère les entités
POCO à partir du modèle edmx, ce template nous génère avec nos POCO la partie qui
s’occupe du Tracking de changements et les entités deviennent alors des STE : Self
Tracking Entities, c’est à dire qu’elles embarquent la logique de Tracking. Et qu’en
est il du lazy loading? Là par contre, si le lazy loading est un point crucial pour
vous alors cette solution n’est pas faite pour vous, ou bien vous allez vous embarquer
dans un développement custom.
</p>
        <p>
Comment tester que le “Self Tracking” marche?
</p>
        <p>
Pour tester il suffit de charger une entité de la base de données, modifier une de
ses propriétés et appeler le SaveChanges du context en cours, si la modification est
sauvegardée en base de données c’est que le Tracking de changement a bien fonctionné.
</p>
        <p>
          <strong>Récapitulons</strong>
        </p>
        <p>
Nous avons trois manières de travailler avec Entity Framework dans une applications
n-tiers:
</p>
        <p>
1 – Utiliser les entités Entity Framework (non POCO) dans toutes les couches de notre
application : 
</p>
        <p>
- C’est mal !!! pour diverses raisons que nous avons parcouru <a href="http://www.zied.fr/2009/09/17/EntityFrameworkV2ViteUnSuccesseur.aspx" target="_blank">dans
un précédent article</a> 
</p>
        <p>
- Pas de problème de sérialisation des entités via un service WCF
</p>
        <p>
- Nous Bénéficions du tracking de changements et du Lazy Loading
</p>
        <p>
2 -  Utiliser des entités POCOs <strong>avec génération de proxy</strong> et
le Template T4 C# POCO Entity Generator : 
</p>
        <p>
- Problème de sérialisation des entités via un service WCF
</p>
        <p>
- Nous Bénéficions du tracking de changements et du Lazy Loading
</p>
        <p>
3 -  Utiliser des entités POCOs <strong>sans génération de proxy</strong> et
le Template T4 C# POCO Entity Generator : 
</p>
        <p>
- Pas de problème de sérialisation des entités via un service WCF
</p>
        <p>
- Nous Bénéficions du Self Tracking
</p>
        <p>
- Pas de Lazy loading
</p>
        <p>
Faites votre choix selon vos besoins et vos exigences :)
</p>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=05dd6c52-09a2-43c9-96bf-51bd4bbee471" />
      </div>
    </content>
  </entry>
</feed>
