<?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>2012-02-19T22:22:35.5338619+01: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>[TechDays2012] Quoi de neuf dans ASP.NET 4.5</title>
    <link rel="alternate" type="text/html" href="http://www.zied.fr/2012/02/19/TechDays2012QuoiDeNeufDansASPNET45.aspx" />
    <id>http://www.zied.fr/PermaLink,guid,b8ddaff6-12d7-471b-b4b9-eb5ac3b214db.aspx</id>
    <published>2012-02-19T22:21:01.9804975+01:00</published>
    <updated>2012-02-19T22:22:35.5338619+01:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
J’ai eu l’honneur et le plaisir de présenter la session <a href="http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx?SessionID=6e6f95a3-9430-4c45-8818-f74c6d9a1b9f#&amp;fbid=dMojXaVvuXs">“Quoi
de neuf dans ASP.NET 4.5”</a> aux TechDays 2012 le 07/02/2012 aux côtés de <a href="http://blogs.codes-sources.com/tja/default.aspx">Thomas
Jaskula</a>. 
</p>
        <p>
          <a href="http://www.slideshare.net/mohamedziednemili/quoi-de-neuf-dans-aspnet-45">Les
slides sont ici</a>.
</p>
        <p>
Nous avons mis en ligne les sources des différentes démos sur un repository git :
</p>
        <p>
          <a href="https://github.com/tjaskula/TechDays-2012-ASP.NET-4.5">https://github.com/tjaskula/TechDays-2012-ASP.NET-4.5</a>
        </p>
        <p>
          <a title="git://github.com/tjaskula/TechDays-2012-ASP.NET-4.5.git" href="git://github.com/tjaskula/TechDays-2012-ASP.NET-4.5.git">git://github.com/tjaskula/TechDays-2012-ASP.NET-4.5.git</a> (Lien
git pour télécharger les sources avec un client git)
</p>
        <p>
Les 2 solutions sont des solutions VS 2011, n’oubliez pas d’ouvrir votre visual studio
en admin.
</p>
        <p>
Voilà tout, n’hésitez pas si vous avez des questions ou des remarques.
</p>
        <p>
Avant de finir j’aimerais remercier tout ceux qui se sont déplacés à notre session.
</p>
        <p>
A la prochaine <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Clignement d'œil" src="http://www.zied.fr/content/binary/Windows-Live-Writer/ASP.NET_136FF/wlEmoticon-winkingsmile_2.png" /></p>
        <img width="0" height="0" src="http://www.zied.fr/aggbug.ashx?id=b8ddaff6-12d7-471b-b4b9-eb5ac3b214db" />
      </div>
    </content>
  </entry>
  <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>
</feed>
