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

Entity Framework Discussion :

[EF4] Procédure stockée retournant une entité avec des champs supplémentaires


Sujet :

Entity Framework

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 64
    Points : 48
    Points
    48
    Par défaut [EF4] Procédure stockée retournant une entité avec des champs supplémentaires
    Bonjour,

    nous utilisons actuellement dans notre projet l'Entity Framework 4. Nous avons ainsi un modèle EDMX avec plusieurs entités mappés à notre base de données.

    Une de nos méthodes métiers utilisant LINQ to Entities met plusieurs secondes à s'exécuter car le traitement est assez lourd, il y a des JOIN et des EXCEPT entre plusieurs listes d'objets (entités X) et beaucoup de boucles FOREACH.

    Nous souhaiterions donc déporter ce lourd traitement dans une procédure stockée afin de réduire fortement le temps d'exécution (c'est pour nous la seule solution viable).

    Le problème est que certains champs que retournerait cette procédure stockée ne peuvent pas être mappés à notre entité X puisqu'ils n'existent pas dans la table Y correspondante en base. Il s'agit de champs calculés (ou supplémentaires) à partir d'autres champs. Actuellement, ces champs se trouvent dans une classe partielle de l'entité X.

    Question :

    - y a t'il moyen de mapper les champs se trouvant dans la classe partielle de l'entité X aux colonnes retournées par la procédure stockée ?
    - ou alors y a t'il moyen de déclarer ces champs directement dans le modèle EDMX (en tant que propriétés scalaires de l'entité X) et d'indiquer qu'on ne souhaite pas mapper ces champs avec la table Y (sinon VS2010 nous le signale et ne veut pas compiler) ?

    Je sais qu'une solution est de passer par un type complexe mais cela ne nous arrange pas du tout car il faudrait réécrire toute la couche métier de cette entité X ainsi que les différentes pages ASPX qui utilisent cette entité. De plus, cette entité X possède des clés étrangères vers d'autres entités dont les propriétés sont susceptibles d'être affichées dans l'IHM Web.

    J'ai fait d’innombrables recherches sur le Web (forum anglais notamment) et je n'ai rien trouvé de convaincants, j'espère trouver une réponse ici

  2. #2
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Les propriétés en question sont calculées comment ? Si tu peux les calculer en C# à partir des autres propriétés de l'entité, il suffit de les ajouter dans une classe partielle

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // le reste de la classe est généré par le designer EDMX
    public partial class TonEntite
    {
        public int TaProprieteCalculee
        {
            get { return this.X + this.Y; }
        }
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Bonjour tomlev et merci pour ta réponse rapide (je n'ai malheureusement pas reçu de notification, je vois ta réponse par hasard en revenant sur le forum).

    Certaines propriétés calculées sont déjà dans ma classe partielle car elles se basent sur d'autres propriétés de l'entité X donc pour celles-ci pas de problèmes (je sais faire).

    Par contre, d'autres propriétés calculées sont basées sur des propriétés d'autres entités, je ne peux donc pas faire le calcul dans ma classe partielle une fois les données ramenées. Il faut absolument que ce soit la procédure stockée qui me ramène ces propriétés et c'est bien là le problème...comment je mappe ces propriétés calculées aux colonnes retournées par la procédure stockée ?

    Exemple :

    Pour la propriété calculée "ValeurParDefaut" de l'entité X, on affecte la propriété "Valeur" soit de l'entité X, soit de l'entité "Y", soit de l'entité "Z".
    L'entité X ayant une propriété de navigation sur Y (de type 0..1) et sur Z (de type 0..N). On est seulement en mesure d'affecter la propriété "ValeurParDefaut" au moment du requêtage....une fois que les propriétés mappées ont été ramenées, c'est trop tard...c'est pour ça que c'est à la procédure stockée de les retourner par la même occasion.

    J'espère être clair dans mes propos, vois-tu mieux mon soucis ?

    Merci d'avance !

  4. #4
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ymerej Voir le message
    J'espère être clair dans mes propos, vois-tu mieux mon soucis ?
    Oui, mais je ne vois pas la solution...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Une solution trash serait de rajouter des colonnes bidons dans la table mappée avec mon entité X, comme ça on pourrait mapper les propriétés calculées avec ses colonnes mais c'est vraiment pas joli du tout car les colonnes ne seraient jamais utilisées (juste pour le retour de la proc sto)...

    J'en reviens toujours pas de ne pas avoir trouvé de solution sur le net et que ce ne soit pas intégré à l'EF4

    Merci quand même en tout cas !

  6. #6
    CUCARACHA
    Invité(e)
    Par défaut
    Salut,

    J'ai déjà été confronté à ce problème qui est assez épineux, surtout si on ne veut pas avoir à retoucher la moitié de l'application à chaque régénération du modèle.

    L'astuce que j'ai mis en oeuvre est d'ajouter un schéma à la base de données nommé zzzHID (Pour être à la fin de la liste).
    Je crée autant de tables (qui ne seront jamais remplies) que nécessaires dans ce schéma, ainsi, à chaque génération, les classes extraites de leur signature seront régénération automatiquement.

    Etant donné que les schémas n'apparaissent pas dans Entity Framework, ça fonctionne parfaitement.

    Pour les éventuels détracteurs qui ont commencé à me maudire dès le deuxième paragraphe, sachez que je donne plus d'importance à la génération automatique qu'à la propreté absolue du modèle de données. Ceci ayant encore plus de sens si vous générez votre couche domain à l'aide d'un template POCO.

    En espérant que ça vous a aidé,

    Cordialement

    Laurent

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Merci pour ta réponse Laurent.

    Oui c'est assez épineux comme tu dis ^^

    Quelques petites questions :

    L'astuce que j'ai mis en oeuvre est d'ajouter un schéma à la base de données nommé zzzHID (Pour être à la fin de la liste).
    Quel est l'intérêt que le schéma zzzHID apparaissent en fin de liste ? C'est juste pour qu'il ne se mélange pas visuellement aux autres schémas de la BD ?

    Je crée autant de tables (qui ne seront jamais remplies) que nécessaires dans ce schéma
    Le fait d'ajouter les nouvelles tables à ce schéma, c'est juste pour qu'elles ne se retrouvent pas dans le même schéma que les autres tables ou est-ce une feinte obligatoire ?

    Etant donné que les schémas n'apparaissent pas dans Entity Framework, ça fonctionne parfaitement.
    Sous EF4, je vois les schémas lors de la mise à jour du modèle donc je comprends pas ce que tu as voulu dire ?

    Sinon, beau détournement du problème, bravo ^^ j'avais aussi pensé sinon à créer une vue qui ne contiendrait aucune donnée mais qui renverrait les bonnes colonnes (juste pour le mapping).

    Bon par contre ça ne reste pas très beau mais si c'est la seule solution...
    Je ne comprends pas pourquoi ils n'ont pas intégré cette fonctionnalité dans l'EF4...vivement la prochaine version !!

  8. #8
    CUCARACHA
    Invité(e)
    Par défaut
    Citation Envoyé par ymerej Voir le message
    Quel est l'intérêt que le schéma zzzHID apparaissent en fin de liste ? C'est juste pour qu'il ne se mélange pas visuellement aux autres schémas de la BD ?
    OUI

    Citation Envoyé par ymerej Voir le message
    Le fait d'ajouter les nouvelles tables à ce schéma, c'est juste pour qu'elles ne se retrouvent pas dans le même schéma que les autres tables ou est-ce une feinte obligatoire ?
    OUI mais pas obligatoire (je suis un peu maniaque)

    Citation Envoyé par ymerej Voir le message
    Sous EF4, je vois les schémas lors de la mise à jour du modèle donc je comprends pas ce que tu as voulu dire ?
    Le nom du Schéma ne se répercute pas dans le nom des objets, seul le nom de la table est repris donc, cette gymnastique ne va pas perturber la génération normale du modèle.

    Citation Envoyé par ymerej Voir le message
    Sinon, beau détournement du problème, bravo ^^ j'avais aussi pensé sinon à créer une vue qui ne contiendrait aucune donnée mais qui renverrait les bonnes colonnes (juste pour le mapping).

    Bon par contre ça ne reste pas très beau mais si c'est la seule solution...
    Je ne comprends pas pourquoi ils n'ont pas intégré cette fonctionnalité dans l'EF4...vivement la prochaine version !!
    Restons pragmatiques, le monde du dev va si vite que le temps que tu pondes une solution tu as déjà la nouvelle version du truc sur lequel tu bosses qui résout le problème

    ++

    Laurent

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Ok merci pour tes réponses.

    En attendant une évolution de l'Entity Framework...je crois que je vais pencher pour cette solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. modifier une entité avec des propriétés de navigation
    Par technosmile dans le forum Entity Framework
    Réponses: 0
    Dernier message: 30/06/2011, 17h31
  2. Réponses: 2
    Dernier message: 19/05/2010, 16h20
  3. Réponses: 4
    Dernier message: 26/08/2009, 15h36
  4. Réponses: 1
    Dernier message: 23/08/2009, 14h55
  5. [VB.Net]Procédure Stocké retournant une valeur
    Par waldo2188 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/05/2005, 12h56

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