Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu MEZIL

I love .Net

Abonnements

Actualités

Locations of visitors to this page English blog

EDM mapping quelques possibilités

Mike Taulty vient présenter, via son blog, un certain nombre de manipulation qu'il est possible de faire avec EDM.

J'ai plus ou moins parler de tout lors des Techdays. Cependant, le point 8, mapper plusieurs tables sur une même entité, est assez différent de la présentation que j'ai effectuée vu que dans son exemple, Mike Taulty prend deux tables identiques.

Ce point, avec ceux que j'ai présenté aux Techdays (je vais bientôt publier un article pour récapituler tout ça), montre un des intérêts majeurs d'EDM : réduire considérablement l'impact des modifs de la base sur le code.

Imaginons qu'on ait une table Cars et que pour des raisons de performances, le DBA décide d'éclater sa table en deux tables NewCars et OldCars, il va être possible, comme le montre Mike Taulty de n'associer qu'une seule entité à ces deux tables. Par conséquent, il va bien entendu falloir modifier la description de la base (ssdl) et le mapping (msl) mais il ne sera pas nécessaire de modifier la description des entités (csdl) sauf pour éventuellement rajouter une propriété IsOld et donc le code existant (qui se base sur les entités) continuera de fonctionner.

J'aimerais revenir sur le mapping de Mike Taulty. En principe, les conditions s'appliquent sur les colonnes de la base non mappées (à l'exeption des conditions Is Not Null pour lesquelles, il faut mapper la colonne). En revanche, dans le cas présent, le mapping se fait sur une propriété de l'entité non mappée (cela n'est pas possible avec la version actuelle du designer, il faut le faire à la main). Le fait d'avoir fait cela va modifier la requête sql. Par exemple, context.Cars va générer la requête SQL suivante :

SELECT
 [UnionAll1].[id] AS [C1],
 [UnionAll1].[manufacturer] AS [C2],
 [UnionAll1].[type] AS [C3],
 CASE WHEN ([UnionAll1].[C1] = 1) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C4]
FROM  (SELECT
 [Extent1].[id] AS [id],
 [Extent1].[manufacturer] AS [manufacturer],
 [Extent1].[type] AS [type],
 cast(0 as bit) AS [C1]
 FROM [dbo].[newCars] AS [Extent1]
UNION ALL
 SELECT
 [Extent2].[id] AS [id],
 [Extent2].[make] AS [make],
 [Extent2].[model] AS [model],
 cast(1 as bit) AS [C1]
 FROM [dbo].[oldCars] AS [Extent2]) AS [UnionAll1]

Cela signifie aussi que même si la propriété isOld n'est pas mappée sur une colonne, elle sera magré tout renseignée par la base.

Au niveau de la requête SQL, vous aurez sûrement remarqué le

CASE WHEN ([UnionAll1].[C1] = 1) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C4]

pourrais simplement être remplacé par

([UnionAll1].[C1] AS [C4].

L'ADO .Net team est consciente qu'il reste un certain nombre d'optimisations des requêtes SQL générées à intégrer avant la sortie finale.

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é vendredi 15 février 2008 07:30 par Matthieu MEZIL

Classé sous : , , , , ,

Commentaires

# re: EDM mapping quelques possibilités @ samedi 16 février 2008 02:20

Sauf que l'exemple de Mike Taulty ne marche pas...

En effet, en se mappant sur deux tables tel qu'il l'a fait, il y a le risque d'avoir deux entités avec la même clé. D'ailleurs si vous exécutez l'exemple, vous aurez le résultat suivant :

1, ford, focus, False

1, ford, focus, False

Pourtant la requête générée retourne bien

1 ford focus 0

1 ford capri 1

Cependant, vu que la clé est la même, l'EF ne va pas recharger une deuxième fois l'entité, d'où le résultat (2 fois le même résultat).

Donc dans ce cas là, le minimum serait de mettre la colonne id en uniqueidentifier (Guid en .net).

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Dell Inspiron Mini 9 - Enfin en vente !!! par The diary of EBArtSoft le il y a 8 heures et 23 minutes

- Solution Template et Project Template dans Visual Studio par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 11 heures et 5 minutes

- PocketIE et Assignation du SRC d'un Element IMG par Jerome Laban le il y a 11 heures et 57 minutes

- Conversion de fichiers RAW en fichier JPEG avec WPF par Perspective le il y a 12 heures et 33 minutes

- Mise à Jour du Moteur de Recherche des Arrêts de Bus de Montréal par Jerome Laban le il y a 13 heures et 17 minutes

- [WPF] XPSReader v0.2 par Blog Technique d'Audrey PETIT le il y a 14 heures et 18 minutes

- Entity Framework : providers Oracle, MySQL et PostgreSQL par Matthieu MEZIL le il y a 20 heures et 53 minutes

- [WPF] Nouvel article sur c2i.fr par Richard Clark le 09-06-2008, 17:33

- F# nouvelle CTP 1.9.6.2 (update) par Pierrick's Blog le 09-06-2008, 13:27

- La suite ...Proposition de collaboration rédactionnelle entre les communautés de développeurs et Microsoft France par LucasR le 09-05-2008, 17:45