IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[MVC] Entity Framework


Sujet :

ASP.NET

  1. #1
    CUCARACHA
    Invité(e)
    Par défaut [MVC] Entity Framework
    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

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    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.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    Donc il suffit de rechercher les propriétés qui ont cet attribut avec EntityKeyProperty = true :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    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.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    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.
    Certes... je suis allé au plus simple, mais il vaut sans doute mieux se baser sur le XML

  6. #6
    CUCARACHA
    Invité(e)
    Par défaut Merci
    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

  7. #7
    CUCARACHA
    Invité(e)
    Par défaut
    Re,

    On a finalement opté pour MetadataWorkspace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
            }
        }
    }
    On peut sortir lstKeys en une seule requête linq / object ?

    Merci

    Laurent

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah, ben ça m'a l'air tout propre comme solution
    Bon à savoir en tous cas, je n'avais jamais utilisé MetadataWorkspace...

    On peut sortir lstKeys en une seule requête linq / object ?
    Essaie comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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() ;

  9. #9
    CUCARACHA
    Invité(e)
    Par défaut
    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 ?

Discussions similaires

  1. [Débutant] Afficher les informations d'utilisateur courant ASP.NET MVC Entity framework
    Par risutsukoo dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 11/05/2015, 21h15
  2. Architecturer un projet MVC en N-tiers, avec entity framework
    Par Arnaud13 dans le forum ASP.NET MVC
    Réponses: 6
    Dernier message: 10/11/2013, 20h56
  3. Vs 2012/MVC 4: Entity Framework, comment atteindre les tables?
    Par sundyata37 dans le forum ASP.NET MVC
    Réponses: 3
    Dernier message: 10/09/2013, 10h25
  4. One to Many/One avec ASP.NET MVC et Entity Framework
    Par kaisser dans le forum Entity Framework
    Réponses: 6
    Dernier message: 17/08/2011, 22h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo