Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1)

Dans la vision de Microsoft, l’Entity Framework est la technologie d’accès à une base de données. Si certains sont déjà convaincus par la V1 (moi par exemple Wink), il n’en demeure pas moins que pour s’imposer face à N-Hibernate, LLBLGenPro, pour ne citer qu’eux, MS doit continuer d’investir massivement sur cette techno. Bonne nouvelle, c’est exactement ce qui est fait Smile.

Beaucoup de nouveautés seront donc apportées à la V2 d’EF, également appelée EF4 (pour prendre le numéro de .NET). La plus part ont déjà été annoncées sur le blog EFDesign. Toutes ne sont pas encore disponibles dans la beta 1 dans laquelle on retrouve également des nouveautés sur lesquelles MS n’avait pas communiqué officiellement.

Quelles sont donc les nouveautés de cette Beta :

  • le POCO bien sûr. C’est de toute évidence le principal investissement de la part de l’EF Team.

Pour les non initiés, POCO signifie Plain Old CLR Objects. Pour faire simple, il s’agit d’utiliser des entités sans aucune dépendance avec Entity Framework.

  • le lazy loading.

Pour activer le lazy loading, il faut renseigner la propriété ContextOptions.DeferredLoadingEnabled à true sur le contexte.

  • Les entité “self trackées”

L’idée est de pouvoir déterminer l’état de l’entité quand celle-ci est modifiée indépendamment du contexte. Ceci est notamment très utile dans le cas d’un scénario N-Tiers avec WCF par exemple.

  • L’utilisation des template T4 intégrée dans VS 2010.

Le template T4 permet de complètement maîtriser le code généré à partir du modèle. A noter qu’avec VS 2008, il était possible de faire du T4 mais ce n’était pas natif. VS 2010 Beta 1 + EF4 features CTP1 propose 3 templates T4 prédéfinies :

    • Le template Prescriptive classes (ie les classes d’entité héritent de classes de l’Entity Framework)
    • Le template POCO
    • Le template Self Tracking entities
  • Les fonctions définies dans le modèle

Vu que je n’en ai encore jamais parlé sur mon blog à ce jour, je vais développer un petit peu.

Imaginons que l’on veuille calculer un âge. Pour cela, il faut faire une différence entre la date courante et la date de naissance. Généralement, c’est la date du serveur qui sert de référence.

Seul problème, comment faire ça avec LINQ To Entities. En effet, si on utilise DateTime.Now, c’est la date du poste exécutant la requête LINQ qui va être prise en compte en non la date du serveur.

Avec EF4, il est possible, dans le CSDL, de définir la function suivante :

<Function Name="GetAge" ReturnType="Int32">
    <Parameter Name="person" Type="TestLINQFunctionsModel.Person" />
    <DefiningExpression>
        DiffYears(person.BirthDay, CurrentDateTime())
    </DefiningExpression>
</Function>

Ensuite, cette fonction est utilisable directement dans les requêtes esql.

Ce qui serait vraiment top c’est de rendre cela également possible pour les requêtes LINQ To Entities.

Pour cela, il faut rajouter la méthode à appeler dans la requête LINQ :

public static class PersonExtension

{

    [EdmFunction("TestLINQFunctionsModel", "GetAge")]

    public static int GetAge(this Person p)

    {

        throw new NotSupportedException();

    }

}

// Bien entendu, rien n’oblige à passer par une extension method.

Il est maintenant possible d’utiliser la méthode GetAge dans une requête LINQ to Entities :

var q = from p in context.Persons

        select new { p.LastName, p.FirstName, Age = p.GetAge() };

Cette requête génèrera la requête SQL suivante :

SELECT
1 AS [C1],
[Extent1].[FirstName] AS [FirstName],
DATEDIFF (year, [Extent1].[BirthDay], SysDateTime()) AS [C2]
FROM [dbo].[Persons] AS [Extent1]

Avec un procédé similaire, il est également possible d’utiliser directement des fonctions SQL (TSQL, PLSQL, etc.). Vu que je n’aime pas cette idée car cela casse l’abstraction apportée par EF, je ne développerai volontairement pas ce point.

  • La possibilité d’exécuter des requêtes SQL directement
  • La possibilité d’utiliser des entités sans modèle

 

A cela, il faut rajouter plein de nouveautés très utiles dans le designer :

  • La gestion des Complex Type

Les complex types sont enfin supportés par le designer même s’ils ne sont visibles que dans le model browser. Il y a même la possibilité de faire du refactoring

  • La possibilité de faire du Model First

Il est possible de générer la base à partir des entités.

  • La possibilité de “singuliariser” les noms des classes d’entité automatiquement lors de la récupération depuis la base
  • La possibilité de supprimer des éléments du SSDL
  • La correction des problèmes du style “la propriété est non mappée” pour les complex types et l’Horizontal Entity Splitting

 

Enfin, il y a plusieurs nouvelle classes et méthodes très pratiques qui ont été rajoutées. Je reviendrai dessus au fur et à mesure de mes posts.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mercredi 24 juin 2009 22:05 par Matthieu MEZIL

Commentaires

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 25 juin 2009 09:58

Personnellement j'utilise NHibernate depuis un bon bout de temps.

A l'arrivé de la première version de EF, j'ai vite compris que ce n'était pas encore ça.

Avec la nouvelle version nous retrouvons les fonctionnalité que je dirai "nécessaires" (lazy loading etc).

Ca mérite un petit test :) pour comparer :)

tja

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 25 juin 2009 09:59

Merci pour ce résumé :)

Alexandre Marlot

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 25 juin 2009 10:49

Je pense exactement comme tja.

J'utilise pas mal nhibernate mais je vais tester EF4.

A suivre.

aragorn185

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 25 juin 2009 10:51

@ Alexandre : de rien

@ Thomas :

"A l'arrivé de la première version de EF, j'ai vite compris que ce n'était pas encore ça."

Je ne suis pas d'accord avec cette phrase. Certaines choses étaient possibles avec NHibernate et ne l'étaient pas avec EF : POCO, Lazy loading (quoi que pour le lazy loading on pouvait "feinter" pour le rendre possible). A noter également que pour les deux points cités, en téléchargeant la dll de Jarek Kowalski, c'était possible.

En revanche, il y avait dès la V1 des choses intéressantes dans EF qui n'existent pas dans NHibernate à commencer par l'implémentation extrèmement "réduite" de LINQ dans NHibernate et la possibilité d'avoir un double niveau de mapping grâce au SSDL.

Matthieu MEZIL

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 25 juin 2009 14:50

@ Matthieu

Merci pour ta réponse. Je pense que EF4 sera très intéressant à étudier mais pour le moment je ne suis pas prêt à faire le pas pour passer de NHibernate vers EF.

Peux tu préciser 'le double niveau de mapping' ?

tja

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 25 juin 2009 16:49

@ Thomas :

EF se base sur l'Entity Date Model (EDM). Celui-ci est décomposé en trois parties : le SSDL qui correspond à la description de la base, le CSDL qui correspond à la description des entités et le MSL qui correspond à la description du mapping entre le CSDL et le SSDL.

Cependant, il est possible (très utile avec les bases "étranges") de modifier le SSDL afin de ne pas utiliser la vraie description de la base. Il s'agit donc d'une sorte de mapping. De plus, il est possible de définir des SSDL views qui permettent de définir une vue directement dans le SSDL sans que celle-ci existe en base et idem avec les SSDL functions qui correspondent aux procédures stockées. Cette utilisation n'est pas fréquente mais peut être bien utile dans certains cas.

Matthieu MEZIL

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ lundi 12 octobre 2009 19:07

Je suis séduit par EF4 (VS2010 beta1);

Toutefois, que pensez-vous de EF4 vs CodeFluent dans le cadre d'une application Silverlight 2/3 ??

(ou bien NHibernate vs CodeFluent).

Sachant qu'il me semble que le puissant Designer "CodeFluent modeler" ne soit pas encore en mode Release.  ;-(

thavo

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ jeudi 15 octobre 2009 21:16

@thavo:

Je ne connais pas assez CodeFluent pour te répondre mais je ne suis pas sûr qu'EF et CodeFluent soient "concurrents". Code Fluent va beaucoup plus loin qu'EF dans la génération même si les templates T4 offrent de super possibilités avec EF. Code Fluent ne travaille que par procédures stockées ce qui a l'avantage des perfs mais peut aussi être contraignant. Perso, je n'aime pas les procédures stockées car ça revient souvent à exporter une partie de ta logique métier dans la BD, ce que je n'aime pas ça. EF peut bosser avec les procédures stockées mais il peut aussi travailler sans.

J'ai envoyé un mail à mes amis de CodeFluent pour qu'ils rajoutent un commentaire et nous éclair sur le sujet.

Matthieu

Matthieu MEZIL

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ lundi 19 octobre 2009 11:09

Puisque l'on nous propose de rebondir sur l'échange, voici nos commentaires sur le sujet initial mais aussi les points soulevés par Matthieu.

1. Question initiale : CodeFluent dans une architecture Silverlight

CodeFluent propose une valeur ajoutée spécifique et unique sur les architectures Silverlight. L'approche de proxy mise en oeuvre par le producteur WCF de CodeFluent qui simplifie la programmation SOA pour la rendre aussi simple qu'en client-serveur est valable également pour Silverlight depuis cet été. Nous avons porté la runtime CodeFluent de manière à permettre un accès très simples aux méthodes dans une architecture Silverlight 2 ou 3, avec notamment le support "transparent" de l'asynchronisme, qui se programme de manière classique. Les détails sont ici http://forums.softfluent.com/default.aspx?g=posts&m=90&#x0;ost90 et l'exemple complet de code sur Silverlight avec le document explicatif est ici http://www.codefluent.com/Samples.aspx

2. CodeFluent et les outils d'ORM

Comme le précise Matthieu, CodeFluent ne se positionne pas comme concurrent des outils d'ORM (Entity Framework, NHibernate, EUSS...). CodeFluent propose une continuité objet-relationnel mais ce n'est qu'une toute petite partie du produit. Pour des besoins de mapping plus "lourds" (contrainte d'existant par exemple), on peut toujours combiner un ORM avec du CodeFluent mais notre expérience nous prouve que le besoin de continuité et de facilité de mise en oeuvre qui se fait directement avec CodeFluent dans 95% des cas fonctionne très bien. Par ailleurs, pour avoir une idée de la couverture de CodeFluent, on peut regarder http://www.codefluent.com/Features.aspx ou encore observer l'analyse du code source de CodeFluent (environ 500 000 lignes de C#) réalisée par NDepend. L'équipe R&amp;D a expliqué cela sur notre blog ici http://codefluent.wordpress.com/2009/06/15/whats-in-codefluent. On voit bien que la modélisation qui constitue une grosse partie se positionne au-dessus des couches techniques sous-jacentes avec un objectif de pouvoir les fédérer dans de multiples architectures, existantes et futures.

3. CodeFluent et les procédures stockées

Matthieu a raison de se méfier des procédures stockées qui contiendraient trop de code métier. Mais les bannir nous semble extrême, et il faut aussi se méfier du code de récupération de données qui serait géré trop loin de la base. Notre expérience nous amène à tirer parti des procédures stockées pour des raisons de performance, de sécurité et d'exploitabilité. Ceci permet de valider un maximum de scénarios en amont, et non une fois en production, dans des contextes où des mécanismes trop dynamiques font tomber dans des cas particuliers non testés, et avec de grosses difficultés de débogage. Cependant, rien n'interdit encore de combiner les procédures stockées créées par CodeFluent avec d'autres requêtes. Sur notre dernier projet CodeFluent for SharePoint, nous avons dû développer une fonctionnalité  de requêtage dynamique pour des besoins sophistiqués de recherche multi-critères, et avons utilisé pour cette partie du projet, le support de Linq fourni par CodeFluent ainsi que la librairie "Dynamic LINQ" développée par Microsoft et expliqué ici http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx.

4. Disponibilité de CodeFluent Modeler

Nous savons que l'impatience du marché pour notre environnement graphique est grande et nous y travaillons. Néanmoins, nous avons toujours donné la priorité à livrer un produit qui permette donner des solutions de production à nos clients, et de couvrir toujours plus de scénarios. Pour cette raison, le Modeler n'est pas "stricto sensu" indispensable au résultat produit par nos clients qui ont développé des projets très ambitieux dans différentes architectures depuis déjà plusieurs versions. Nous avons aussi mise en priorité cet été quelques fonctionnalités SharePoint pour des scénarios sophistiqués et également le support d'Oracle sur lequel nous nous sommes engagés pour deux clients et que nous livrerons très prochainement. De ce fait, la mise sur le marché du Modeler a été quelque peu retardée, sachant que nous voulons réellement faire la différence avec cet environnement de modélisation qui va probablement révolutionner le développement. Donc patience, il va venir un peu plus tard (mais pas tant que ça)... mais il va venir très fort ! Stay tuned.

Vos serviteurs de SoftFluent

Daniel COHEN-ZARDI

# re: Entity Framework : Quoi de neuf avec EF4 (VS 2010 + Feature CTP1) @ lundi 19 octobre 2009 22:34

Merci pour ces éclaircissements détaillés Daniel.

Matthieu

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Après Montréal, ce sera Barcelone, rendez-vous à la European SharePoint Conference 2014 ! par Le blog de Patrick [MVP SharePoint] le 04-19-2014, 09:21

- Emportez votre sélection de la MSDN dans la poche ? par Blog de Jérémy Jeanson le 04-17-2014, 22:24

- [ #Office365 ] Pb de connexion du flux Yammer ajouté à un site SharePoint par Le blog de Patrick [MVP SharePoint] le 04-17-2014, 17:03

- NFluent & Data Annotations : coder ses propres assertions par Fathi Bellahcene le 04-17-2014, 16:54

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le 04-17-2014, 06:34

- [ SharePoint Summit Montréal 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 20:44

- [ SharePoint Summit Montréal 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 18:30

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le 04-16-2014, 17:17

- [ SharePoint Summit Montréal 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 16:51

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57