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 :