<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://aspectize.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Les news d&amp;#39;Aspectize : EntityDesigner</title><link>http://aspectize.com/blogs/corp/archive/tags/EntityDesigner/default.aspx</link><description>Tags: EntityDesigner</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>La quadrature du cercle</title><link>http://aspectize.com/blogs/corp/archive/2009/09/02/la-quadrature-du-cercle.aspx</link><pubDate>Wed, 02 Sep 2009 11:11:00 GMT</pubDate><guid isPermaLink="false">3d57e66d-6e97-4fde-a1fe-09655b785c0e:60</guid><dc:creator>Nico</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://aspectize.com/blogs/corp/rsscomments.aspx?PostID=60</wfw:commentRss><comments>http://aspectize.com/blogs/corp/archive/2009/09/02/la-quadrature-du-cercle.aspx#comments</comments><description>&lt;span class="Apple-style-span" style="WORD-SPACING:0px;FONT:16px &amp;#39;Times New Roman&amp;#39;;TEXT-TRANSFORM:none;TEXT-INDENT:0px;WHITE-SPACE:normal;LETTER-SPACING:normal;BORDER-COLLAPSE:separate;orphans:2;widows:2;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"&gt;&lt;span class="Apple-style-span" style="FONT-SIZE:13px;FONT-FAMILY:Verdana;"&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;i&gt;&lt;img height="176" alt="" src="http://aspectize.com/blogs/corp/quadrature%20cercle.png" width="175" border="0" /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;i&gt;La quadrature du cercle est un problème classique de géométrie, qui consiste à construire un carré de même aire qu&amp;#39;un cercle donné à l&amp;#39;aide d&amp;#39;une règle et d&amp;#39;un compas. Il remonte à l&amp;#39;invention de la géométrie et a occupé de nombreux mathématiciens au cours des siècles. Grégoire de Saint-Vincent était passionné par le problème : estimant — à tort — l&amp;#39;avoir résolu, il exposa ses solutions dans un ouvrage de 1 000 pages. C&amp;#39;est en 1837 que Pierre-Laurent Wantzel démontre un théorème qui permet d&amp;#39;exhiber la forme des équations dont sont solutions les nombres constructibles à la règle et au compas. Puis en 1844, Joseph Liouville met en évidence l&amp;#39;existence des nombres transcendants. Mais il faudra attendre jusqu&amp;#39;en 1882 pour que le mathématicien allemand Ferdinand von Lindemann démontre la transcendance de&amp;nbsp;π pour appliquer le théorème de Wantzel au problème de la quadrature du cercle et ainsi démontrer qu&amp;#39;elle est impossible à réaliser. L&amp;#39;Académie des sciences, qui avait déjà pressenti ce résultat un siècle auparavant, n&amp;#39;acceptait plus de « preuve » de cette quadrature depuis 1752.&lt;/i&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;i&gt;La quadrature du cercle nécessite en effet la construction à la règle et au compas de la racine carrée de π, ce qui est impossible en raison de la transcendance de π : les nombres constructibles sont les rationnels et les racines de certains polynômes de degré 2n à coefficients entiers, ce sont des nombres algébriques ce qui n&amp;#39;est pas le cas de π.&lt;/i&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;(source wikipedia).&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;L&amp;#39;ORM est un problème classique de l&amp;#39;industrie logicielle, qui consiste à faire cohabiter un modèle relationnel et un modèle objet. Il est issu de l&amp;#39;omniprésence des bases de données relationnelles, et de l&amp;#39;approche orientée objet, communément pratiquée dans le monde du développement. Pourtant ces 2 mondes reposent sur des approches différentes. Le modèle relationnel est fondé sur la théorie des ensembles, l&amp;#39;algèbre relationnelle, et la logique formelle. Il permet d&amp;#39;appliquer des processus de normalisation qui garantissent la non-redondance des données. Le modèle objet est fondé essentiellement sur les concepts d&amp;#39;Identité, d&amp;#39;Etat, de Comportement et d&amp;#39;Encapsulation.&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;Les principales zones de frottement sont notamment les suivantes:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;inadéquation de la relation d&amp;#39;association: dans une base de données, une relation est bidirectionnelle et s&amp;#39;implémente par une Foreign Key, une colonne qui pointe vers une l&amp;#39;identifiant d&amp;#39;une autre Entité; dans un modèle objet, elle n&amp;#39;est pas nécessairement bi-directionnelle et s&amp;#39;implémente par un pointeur vers une autre structure fortement typée.&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;inadéquation de l&amp;#39;héritage avec la logique relationnelle.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;inadéquation entre l&amp;#39;identité de l&amp;#39;objet et l&amp;#39;identité en base.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;L&amp;#39;objectif des 2 modèles est pourtant bien le même: représenter les informations du monde réel, l&amp;#39;un pour le stockage, l&amp;#39;autre pour les traitements et l&amp;#39;affichage. Mais leur différence d&amp;#39;approche fait que la friction entre les 2 modèles ne peut se faire sans heurts: de la même manière que la transcendance de π démontre l&amp;#39;impossibilité d&amp;#39;une solution pour le problème de la quadrature du cercle, &amp;quot;l&amp;#39;Impedence Mismatch&amp;quot; rend impossible la cohabitation. L&amp;#39;usage d&amp;#39;un ORM sera aussi compliqué qu&amp;#39;approximatif; il suffit de lire &lt;a class="" title="The Vietnam Of Computer Science" href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx" target="_blank"&gt;Ted Neward&lt;/a&gt;&amp;nbsp;et de regarder les nombreuses tentatives vaines de Microsoft sur le sujet (&lt;span&gt;Object Spaces, Active Recordsets, LINQ to SQL et Entity Framework) pour s&amp;#39;en convaincre. Et tous les spécialistes d&amp;#39;NHibernate vous le diront, &amp;quot;c&amp;#39;est une affaire de spécialistes !&amp;quot; et on ne peut pas mettre cet outil entre toutes les mains.&lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;Alors que faire ? Il n&amp;#39;y a pas moultes solutions, il faut faire des sacrifices d&amp;#39;un côté ou de l&amp;#39;autre.&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;Solution 1: utiliser une base de données orientées objet, afin de rendre compatible l&amp;#39;approche utilisée par le développement et l&amp;#39;approche utilisée par le stockage. Mais l&amp;#39;histoire a montré que les bases de données orientées objet présentaient une complexité d&amp;#39;usage que n&amp;#39;ont pas les SGBDR, tandis que ceux-ci offraient au même moment une facilité de compréhension des concepts et des performances bien meilleures.&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;Solution 2: abandonner les concepts de l&amp;#39;approche objet qui sont en conflit avec l&amp;#39;approche relationnelle et garder dans son développement la logique relationnelle. On va bien sur utiliser des objets fortement typés dans leur déclaration pour faciliter la programmation, le langage et l&amp;#39;outil de développement sont bien adaptés pour le faire, mais on va préférer&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;une approche Entiés/Relations où les Entités sont indépendantes les unes des autres, et la relation qui joue le rôle de lien entre les Entités. Le frottement n&amp;#39;en sera que moins douloureux. Une Entité en mémoire ne connait pas la structure des Entités avec lesquelles elle est reliée. C&amp;#39;est la relation qui lui permet d&amp;#39;accéder a ses entités reliées, et qui garantit le caractère bi-directionnel de l&amp;#39;association entre les entités. Cela permet également d&amp;#39;avoir une implémentation invariante de la cardinalité et de faciliter la gestion du cycle de vie des entités, avec un contrôle total sur le LazyLoading.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;abandonner purement et simplement l&amp;#39;Héritage (et indépendamment du sujet ORM, vous ne vous en porterez que mieux pour maintenir votre système !) Une approche de la conception par composition sera bien plus efficace à long terme.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;ne pas mettre de comportement dans les Entités, et préférer une approche Service StateLess; la notion d&amp;#39;identité de l&amp;#39;instance perd alors son importance.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;avoir des identifiants uniques sur les Entités, de type Guid. C&amp;#39;est l&amp;#39;identifiant technique qui jouera le rôle de clé primaire dans la base. Et ne surtout pas prendre des Int autoincrémenté, qui mettent une dépendance forte entre le stockége physique et l&amp;#39;allocation d&amp;#39;un nouvel identifiant.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;Bien entendu, cette deuxième approche n&amp;#39;est pas immédiate, et elle remet en cause beaucoup de choses que les architectes/développeurs ont l&amp;#39;habitude de pratiquer. C&amp;#39;est néanmoins les choix que nous avons faits pour notre couche d&amp;#39;accès aux données. En prenant cette approche, nous avons résolu et facilité un bon nombre de problèmes posés par l&amp;#39;incompatibilité des 2 mondes et nous disposons d&amp;#39;un ORM facile à utiliser et puissant. &lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="MARGIN-TOP:0px;MARGIN-BOTTOM:0px;"&gt;Nous y reviendrons dans les prochains jours, quand la bête sera disponible...&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;img src="http://aspectize.com/aggbug.aspx?PostID=60" width="1" height="1"&gt;</description><category domain="http://aspectize.com/blogs/corp/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://aspectize.com/blogs/corp/archive/tags/EntityDesigner/default.aspx">EntityDesigner</category><category domain="http://aspectize.com/blogs/corp/archive/tags/Approche/default.aspx">Approche</category></item><item><title>Schema et accès aux données</title><link>http://aspectize.com/blogs/corp/archive/2009/03/25/schema-et-acc-232-s-aux-donn-233-es.aspx</link><pubDate>Wed, 25 Mar 2009 08:32:00 GMT</pubDate><guid isPermaLink="false">3d57e66d-6e97-4fde-a1fe-09655b785c0e:29</guid><dc:creator>Nico</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://aspectize.com/blogs/corp/rsscomments.aspx?PostID=29</wfw:commentRss><comments>http://aspectize.com/blogs/corp/archive/2009/03/25/schema-et-acc-232-s-aux-donn-233-es.aspx#comments</comments><description>&lt;p&gt;Cet article a pour objectif de décrire notre approche à propos de l&amp;#39;accès aux données.&lt;/p&gt;
&lt;p&gt;En préambule, un petit aparté sur Entity framework, qui s&amp;#39;inscrit dans la continuité de l&amp;#39;histoire douloureuse des ORM de Microsoft.&lt;/p&gt;
&lt;p&gt;Microsoft a sorti en 2008 la V1 d&amp;#39;Entity Framework. Elle a suscité de nombreuses réactions, plutôt négative de la communauté. Trop intrusif, trop de code à écrire, trop compliqué à utiliser, trop d&amp;#39;inconvénients pour peu de bénéfices. Microsoft a écouté, et a décidé de construire la V2, en transparence, et en communiquant au fur et à mesure de son évolution. Ca se passe &lt;a class="" href="http://blogs.msdn.com/efdesign" target="_blank"&gt;ici&lt;/a&gt;, sur le blog de l&amp;#39;équipe d&amp;#39;EF, et la &lt;a class="" href="http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/bbae53aa-c95c-4a54-ae24-e657a2edae3f/#page:1" target="_blank"&gt;Wish list&lt;/a&gt; (77 pages de Forums !) s&amp;#39;est arrêtée au 15 janvier.&lt;/p&gt;
&lt;p&gt;Malgré cela, l&amp;#39;approbation de la communauté n&amp;#39;est pas encore gagné.&lt;/p&gt;
&lt;p&gt;Un &lt;a class="" href="http://blogs.msdn.com/efdesign/archive/2008/11/20/n-tier-improvements-for-entity-framework.aspx" target="_blank"&gt;article&lt;/a&gt; évoque la gestion du ChangeTracking, fonctionnalité inhérente à tout ORM qui se respecte. Ils ont plus ou moins décidé qu&amp;#39;ils allaient fournir des API pour que les développeurs implémentent eux-mêmes leur gestion du ChangeTracking: que de choses à connaître, et que de code à écrire. &lt;/p&gt;
&lt;p&gt;Autre exemple, la gestion des &lt;a class="" href="http://blogs.msdn.com/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx" target="_blank"&gt;Foreign Keys&lt;/a&gt;. Apparemment, certains voudraient voir les FK dans leurs entités, et d&amp;#39;autres non, car ils considèrent que l&amp;#39;entité est polluée par une FK. D&amp;#39;où une gestion de FK hybride, les Independant Associations&amp;nbsp;apportées par&amp;nbsp;.Net 4.0; encore quelque chose de compliqué et d&amp;#39;artificiel qui nécessitera apprentissage.&lt;/p&gt;
&lt;p&gt;Alors que l&amp;#39;usage du DataSet simplifierait les problèmes, ils évitent soigneusement de l&amp;#39;utiliser, avec des arguments discutables.&lt;/p&gt;
&lt;p&gt;Sami Jabber a parfaitement raison quand il &lt;a class="" href="http://www.dng-consulting.com/blogs/index.php/2008/05/24/entity-framework-un-faux-ami?blog=1" target="_blank"&gt;écrit&lt;/a&gt; à propos d&amp;#39;Entity FrameWork: &amp;quot;Un modèle conceptuel de données qui permet d&amp;#39;abstraire du XML, du relationnel, de l&amp;#39;objet et des DataServices (pour Astoria) a un nom, cela s&amp;#39;appelle de la magie noire&amp;quot;.&lt;/p&gt;
&lt;p&gt;Notre vision est nettement plus simple,&amp;nbsp;pragmatique, compréhensible tant pour sa lecture, que pour son utilisation, souple, dynamique, peu intrusif, et requiert l&amp;#39;écriture d&amp;#39;un minimum de code.&lt;/p&gt;
&lt;p&gt;Des données relationnelles sont persistées quelque part (un fichier, une base de données ? peu importe !), et il serait pratique d&amp;#39;y avoir accès &amp;quot;facilement&amp;quot;. Inversement, des données relationnelles sont en mémoire, et on souhaite les persister quelque part (un fichier, une base de données ? peu importe !), sans trop d&amp;#39;efforts. J&amp;#39;insiste sur le caractère relationnel des données, car c&amp;#39;est le coeur du problème, ou plutot le coeur de la solution.&lt;/p&gt;
&lt;p&gt;Plus précisément, on souhaite écrire le moins de code possible (évitons le SQL) et ne pas être intrusif vis-à-vis des Entités que l&amp;#39;on manipule.&lt;/p&gt;
&lt;p&gt;Et s&amp;#39;il n&amp;#39;y a pas de solution magique, je maintiens qu&amp;#39;il y a plus à gagner à utiliser le DataSet qu&amp;#39;à ne pas le faire. Et pas seulement pour le ChangeTracking, mais pour beaucoup d&amp;#39;autres; serialisation, dynamisme, filtre, tri, Merge, gestion événementielle. &lt;/p&gt;
&lt;p&gt;Et s&amp;#39;il y a quelques défauts, essayons de les gommer, plutôt que de jeter le bébé avec l&amp;#39;eau du bain.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Intellisense: toujours difficile à concilier avec le dynamisme, nous apportons une solution. C&amp;#39;est du typage fort pour le code, côté serveur, et du typage dynamique pour le transport et le Binding, le mariage idéal des 2 mondes.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Validation: les ExtendedProperties permettent de stocker des attributs complémentaires et manquants. Des validateurs standards (Min, Max, Regex), mais aussi Custom avec des Commandes de Validation.&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Navigation: quelques fonctions génériques de navigation, en fonction du typage fort, mais aussi du typage souple, permettent de naviguer de façon extrêmement conviviale et évite la manipulation verbeuse du DataSet qui fait souvent peur au développeur.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Aspectize Entity Designer est l&amp;#39;Outil de Design du modèle conceptuel des données, c&amp;#39;est à dire les Entités et les Relations. De ForeignKey, il n&amp;#39;est point question; nous insistons sur ce point, la Relation existe à part entière, c&amp;#39;est fondamental pour l&amp;#39;approche. Sa cardinalité est définie, mais elle n&amp;#39;a pas d&amp;#39;implication sur le modèle. Cela permet de garantir l&amp;#39;indépendance des Entités. Peu importe si ma Category est liée à un Product ou à autre Chose, cela n&amp;#39;influe pas la nature de mon Entité Category.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://aspectize.com/blogs/corp/ProductCategory.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height="386" alt="" src="http://aspectize.com/blogs/corp/ProductCategory.png" width="633" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Nous pouvons ajouter de nombreux attributs :&lt;br /&gt;- MustPersist: permet de dire si certaines Entités ou&amp;nbsp;Champs ne sont pas sauvegardés. Pratique, quand certaines entités ne servent qu&amp;#39;au calcul ou a l&amp;#39;IHM. A noter que les Relations peuvent également être non persistence.&lt;br /&gt;- Validators: permet de définir un Validateur, écrit en .Net, qui sera toujours appelé lors d&amp;#39;un CommandBinding configuré sur cette commande.&lt;br /&gt;- Triggers: permettent de définir des commandes qui seront automatiquement appelées lorsque l&amp;#39;on impactera une Entité, en fonction du State (Add, Delete, Update).&lt;/p&gt;
&lt;p&gt;Un des attributs les plus intéressant est sans doute le Temporel, qui permet de définir automatiquement la dépendance au temps d&amp;#39;une donnée: dans mon exemple, le prix du produit est historisé, et est donc stocké dans une autre table. L&amp;#39;intérêt de l&amp;#39;attribut Temporel est que cela est complètement transparent d&amp;#39;un point de vue logique: j&amp;#39;ajoute même un autre champ qui me permet d&amp;#39;avoir le prix courant, sans être obligé d&amp;#39;interroger systématiquement l&amp;#39;historique des prix.&lt;/p&gt;
&lt;p&gt;&lt;img height="399" alt="" src="http://aspectize.com/blogs/corp/ProductCategoryPriceHistory.png" width="622" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;EntityManager est notre composant d&amp;#39;accès aux données. Il permet, via une API extrêmement simple de faire tout ce qu&amp;#39;on veut pour récupérer des données et les sauvegarder.&lt;/p&gt;
&lt;div class="SampleCode"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;
&lt;p&gt;IDataManager&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; dm = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;EntityManager&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.FromDataBaseService(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;MyDataService&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;Pour récupérer une Category à partir de son Id:&amp;nbsp;&lt;/p&gt;
&lt;div class="SampleCode"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;
&lt;p&gt;Category&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; category = dm.GetEntity&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Category&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;(id);&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;ou tous les Product associés&amp;nbsp;à une&amp;nbsp;Category, selon la relation CategoryProduct (on pourrait imaginer avoir plusieurs relations entre les mêmes entités): 
&lt;div class="SampleCode"&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;
&lt;p&gt;dm.GetAssociated&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Product&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;CategoryProduct&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;(id);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Accessoirement, c&amp;#39;est la même API pour naviguer dans les données en mémoire, à partir du DataSet (ce qui évite la manipulation verbeuse):&lt;/p&gt;
&lt;div class="SampleCode"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;
&lt;p&gt;List&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Product&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt; products = category.GetAssociatedInstances&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;CategoryProduct&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;();&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;Et pour la sauvegarde, c&amp;#39;est encore plus simple. La seule méthode Save, sauvegarde toutes les lignes du DataSet en fonction des changements:&lt;/p&gt;
&lt;div class="SampleCode"&gt;&lt;font size="2"&gt;
&lt;p&gt;dm.Save();&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;L&amp;#39;énorme avantage est de tirer parti à la fois du typage fort proposé par Entity Designer, et du typage dynamique géré par le DataSet.&lt;/p&gt;
&lt;p&gt;Ainsi, le chargement d&amp;#39;une Category peut s&amp;#39;écrire également:&lt;/p&gt;
&lt;div class="SampleCode"&gt;&lt;font size="2"&gt;dm.LoadData(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ADWData.Category[Id = id]&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/div&gt;
&lt;p&gt;&lt;/font&gt;ou avec les Product associés:&lt;/p&gt;
&lt;div class="SampleCode"&gt;&lt;font size="2"&gt;
&lt;p&gt;dm.LoadData(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;ADWData.Category[Id = id].CategoryProduct.Product&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;);&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;mais aussi ajouter un nouveau Product à une Category:&lt;/p&gt;
&lt;p&gt;uiService.AddRow(&lt;font size="2"&gt;&lt;font color="#a31515"&gt;&amp;quot;ADWData.Category.CategoryProduct.Product&amp;quot;&lt;/font&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Il est du coup, extrêmement facile d&amp;#39;écrire des services d&amp;#39;accès aux données; nous verrons plus tard que nous n&amp;#39;avons même pas à écrire ces services d&amp;#39;accès aux données, car ils peuvent se déduire du DataBinding. L&amp;#39;Application charge toute seule les données qu&amp;#39;elle affiche, en fonction des DataBinding configurés sur les contrôles. &lt;/p&gt;
&lt;p&gt;Difficile de faire plus simple; aucune intrusivité, tous les scénarios d&amp;#39;accès aux données Lazy ou non sont couverts, de façon extrêmement limpide et&amp;nbsp;le DataBinding se charge du reste !&lt;/p&gt;&lt;img src="http://aspectize.com/aggbug.aspx?PostID=29" width="1" height="1"&gt;</description><category domain="http://aspectize.com/blogs/corp/archive/tags/Product/default.aspx">Product</category><category domain="http://aspectize.com/blogs/corp/archive/tags/EntityDesigner/default.aspx">EntityDesigner</category><category domain="http://aspectize.com/blogs/corp/archive/tags/Approche/default.aspx">Approche</category></item><item><title>Entity Designer pour VS 2008</title><link>http://aspectize.com/blogs/corp/archive/2008/05/06/entity-designer-pour-vs-2008.aspx</link><pubDate>Tue, 06 May 2008 07:21:00 GMT</pubDate><guid isPermaLink="false">3d57e66d-6e97-4fde-a1fe-09655b785c0e:17</guid><dc:creator>Nico</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://aspectize.com/blogs/corp/rsscomments.aspx?PostID=17</wfw:commentRss><comments>http://aspectize.com/blogs/corp/archive/2008/05/06/entity-designer-pour-vs-2008.aspx#comments</comments><description>&lt;p&gt;Pour être tout à fait complet sur l&amp;#39;intégration à Visual Studio, il manquait encore la version d&amp;#39;Entity Designer pour VS 2008.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est désormais chose faite, elle est disponible dans la version d&amp;#39;évaluation, en téléchargement.&lt;/p&gt;&lt;img src="http://aspectize.com/aggbug.aspx?PostID=17" width="1" height="1"&gt;</description><category domain="http://aspectize.com/blogs/corp/archive/tags/Product/default.aspx">Product</category><category domain="http://aspectize.com/blogs/corp/archive/tags/VS2008/default.aspx">VS2008</category><category domain="http://aspectize.com/blogs/corp/archive/tags/EntityDesigner/default.aspx">EntityDesigner</category></item></channel></rss>