mars
2010
Premier post sur développez !
Et un petit tip pour tout ceux qui utilisent WCF RIA Services.
Récemment, j’ai été confronté à un petit souci de design de modèle de donnée, qui a engendré un bug auprès de RIA.
Soit le cas suivant :
Je dispose donc (en base de données) de 5 tables :
ModèlePièce identifié par
- IdModelePiece
Fournisseur identifié par
- IdFournisseur
Pièce
Une pièce correspond à un modèle fournit par un fournisseur.
L’identifiant de la pièce est composite :
- Id du fournisseur
- l’id du modèle.
Machine
Une machine correspond à un modèle d’outil (par exemple), qui est composé de pièces.
La machine est identifiée par :
- IdMachine
CompositionMachine
Cette table sert à lié les pièces aux machines.
Donc, l’identifiant est (en composition naturelle) composite et plus complexe (quoi que ) :
- Id de la pièce (composé de idFournisseur + IdModelePiece)
- Id de la machine (IdMachine)
Dans ce cas précis, RIA ne pourra mettre à jour les données de la table CompositionMachine !
La raison principale semble liée à la méthode GetIdentity() qui ne retourne pas correctement l’id d’une clé composite, elle même constituée d’une clé étrangère composite + un autre clé étrangère
Donc, si d’aventure vous utiliser RIA, la solution doit impérativement passer par :
Chaque table a son id propre (style guid ou entier auto incrémenté) + une contrainte d’unicité sur ce qui aurait pu être une clé primaire (en conception naturelle). Cela permet d’éviter les composites dans les clés étrangères.
Dans ce cas de figure, RIA n’est pas confronté à une clé primaire, constituée de clés étrangères, dont un élément au moins est composite.
Ce qui pose donc problème à RIA est bien le fait d’être confronté à une clé primaire constituée de clé étrangères dont une au moins qui est composite.
C’est tordu, mais fallait le savoir!
Espérons qu’en v4 cela soit corrigé !
Ajouté le 04/03/2010
Le message exacte de l’exception était :
Unable to cast object of type ‘System.Windows.Ria.Data.EntityKey`2[System.String,System.Int32]’ to type ‘System.Windows.Ria.Data.EntityKey`2[System.Int32,System.String]’. »
Autres liens parlant du problème :
http://forums.silverlight.net/forums/p/130384/291497.aspx
http://betaforums.silverlight.net/forums/t/117417.aspx
http://forums.silverlight.net/forums/t/115342.aspx