Salut,
Je cherche à extraire le nom du membre d'une classe de l'Entity Framework qui sert de clef primaire à des fins d'automatisation de génération de code.
Quelqu'un sait si c'est jouable ?
D'avance merci
Laurent
Version imprimable
Salut,
Je cherche à extraire le nom du membre d'une classe de l'Entity Framework qui sert de clef primaire à des fins d'automatisation de génération de code.
Quelqu'un sait si c'est jouable ?
D'avance merci
Laurent
Tu veux faire quoi exactement ?
L'ideal c'est de te baser sur le CSDL ou SSDL en fonction du niveau auquel tu veux placer ton générateur de code.
si tu regardes dans le fichier .designer.cs généré pour ton EDM, sur les propriétés clés tu as cet attribut :
Donc il suffit de rechercher les propriétés qui ont cet attribut avec EntityKeyProperty = true :Code:global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
Code:
1
2
3
4 var keyProperties = from prop in typeof(MyEntity).GetProperties() let attr = Attribute.GetCustomAttribute(prop, typeof(EdmScalarPropertyAttribute)) as EdmScalarPropertyAttribute where attr != null && attr.EntityKeyProperty select prop;
Oui c'est une solution mais baser un générateur de code sur un code généré à partir d'un modèle (généré aussi), ça me semble tordu.
L'avantage de l'XML c'est que tu as le modèle de base, pas une représentation déjà retravaillée.
My 2 cts.
Salut,
Je vais en parler à mon client pour connaitre son sentiment sur la meilleure solution à prendre.
Pour ma part je serais pour l'analyse de l'XML mais il est vrai que la solution objet m'a l'air super simple et très élégante.
Merci et à bientôt
Laurent
Re,
On a finalement opté pour MetadataWorkspace
On peut sortir lstKeys en une seule requête linq / object ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 List<string> lstKeys = new List<string>(); var query = from meta in _context.MetadataWorkspace.GetItems(DataSpace.CSpace) where meta.BuiltInTypeKind == BuiltInTypeKind.EntityType select (meta as EntityType) ; foreach (EntityType ety in query) { if (ety.Name == strEntityName) { foreach(EdmMember edm in ety.KeyMembers){ lstKeys.Add(edm.Name); } } }
Merci
Laurent
Ah, ben ça m'a l'air tout propre comme solution :)
Bon à savoir en tous cas, je n'avais jamais utilisé MetadataWorkspace...
Essaie comme ça :Citation:
On peut sortir lstKeys en une seule requête linq / object ?
Code:
1
2
3
4
5
6 List<string> query = (from meta in _context.MetadataWorkspace.GetItems(DataSpace.CSpace) let ety = meta as EntityType where meta.BuiltInTypeKind == BuiltInTypeKind.EntityType && ety != null && ety.Name = strEntityName select ety).SelectMany(ety => ety.KeyMembers, km => km.Name).ToList() ;
Bon va vraiment falloir que je me mette au linq plus sérieusement...
Bon d'un autre côté je suis vieux... Mais est-ce recevable comme excuse ?