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 :

Lazy loading désactivé et récupération des priopriétés de navigation


Sujet :

Entity Framework

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut Lazy loading désactivé et récupération des priopriétés de navigation
    Bonjour à vous,

    J'ai un comportement que je ne comprend pas,
    J'ai un solution qui comporte un projet DAL avec entity framework et un projet ASP MVC 4 webAPI.

    Je veux récupérer une chaine JSON qui correspond à tous mes appel d'offre.
    (voir schéma)

    je fais donc cette requête dans mon contrôleur API :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            public IEnumerable<appelOffre> GetappelOffres()
            {
                var appeloffres = db.appelOffres.Include(a => a.entreprise).Include(a => a.statutAppelOffre).Include(a => a.source);
                return appeloffres.AsEnumerable();
            }
    J'ai mis le lazy loading à false :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public partial class DALEntities : DbContext
        {
            public DALEntities()
                : base("name=DALEntities")
            {
                this.Configuration.LazyLoadingEnabled = false;
            }
    et j'ai rajouté ça dans webApiConfig.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                var json = config.Formatters.JsonFormatter;
                json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                config.Formatters.Remove(config.Formatters.XmlFormatter);
    Malheureusement je récupère mes appelOffre, l'entreprise qui est liée mais aussi les autres appels d'offres liés à l'entreprise...

    Comment dois-je faire pour récupérer uniquement l'entreprise liée et pas plus ?

    Merci à vous
    Images attachées Images attachées  

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par scude Voir le message
    Malheureusement je récupère mes appelOffre, l'entreprise qui est liée mais aussi les autres appels d'offres liés à l'entreprise...
    Je ne pense pas que ta phrase soit claire

    Citation Envoyé par scude Voir le message
    Comment dois-je faire pour récupérer uniquement l'entreprise liée et pas plus ?
    Ce n'est pas clair. Tu veux récupérer les appels d'offres liés à une entreprise donnée ? Si oui alors dans ce cas il faudra passer en paramètre l'id de l'entreprise concernée et mettre un filtre dans ta requête LINQ en utilisant la clause where.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Désolé si ce n'est pas clair, en fait actuellement je veux récupérer uniquement la liste des appels d'offres avec l'entreprise qui lui est associée.

    Mais en fait je récupère en plus les appel d'offres associés à l'entreprise en question (A l'intérieur de l'objet entreprise).
    J'ai l'impression qu'il fait automatiquement un Include("entreprise.appelOffres") que je ne souhaite pas. Il récupère plus que ce que je lui demande.

    J'espère que c'est plus clair, merci à toi de t'être penché sur mon problème

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par scude Voir le message
    Mais en fait je récupère en plus les appel d'offres associés à l'entreprise en question (A l'intérieur de l'objet entreprise).
    J'ai l'impression qu'il fait automatiquement un Include("entreprise.appelOffres") que je ne souhaite pas. Il récupère plus que ce que je lui demande.
    Ah ok. Tu penses qu'il y a des doublons ? Non non. Vu qu'il y a une relation entre l'entité AppelOffre et Entreprise, le contexte de données en a connaissance et du coup quand tu charges des appels d'offres en plus des entreprises il mets à jour automatiquement les relations des deux côtés. Cela marche pour tous les types de relations sauf pour les relations n-n. C'est comme ça que c'est fait et cela ne veut pas dire qu'on a affaire des instances en double

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Ok et du coup si je ne veux pas de cette relation dans ma chaine json je dois m'y prendre comment ? ça alourdie quand même pas mal la chaine.

    Merci pour ta réponse en tout cas

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par scude Voir le message
    Ok et du coup si je ne veux pas de cette relation dans ma chaine json je dois m'y prendre comment ?
    T'es sûr que la sérialisation ne permet pas d'éviter cela ? Bizarre parce si c'est le cas alors ça ça risque de ne pas le faire.

    Utilise Fiddler pour voir ce qu'il te renvoie comme données Json.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Oui certain regarde pour 2 appel d'offre qui partagent l'entreprise d'ID 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"appelOffreCommentaires":[],"entreprise":{"appelOffres":[{"appelOffreCommentaires":[],"statutAppelOffre":{"appelOffres":[],"ID":2,"libelle":"En Cours"},"budgets":[],"projectCommunicators":[],"factures":[],"source":{"appelOffres":[],"ID":2,"libelle":"En Cours","lien":null},"documents":[],"technologies":[],"cvs":[],"ID":10,"titre":"titre 2","pretention":888.0,"dateAjout":"2222-02-02T00:00:00","dateDebut":"2222-02-02T00:00:00","deadLine":"2222-02-02T00:00:00","dateLivraison":"2222-02-02T00:00:00","lienProjet":"test2","entrepriseID":2,"statutAppelOffreID":2,"sourceID":2}],"statutEntreprise":null,"typeEntreprise":null,"personnes":[],"secteurActivites":[],"ID":2,"nom":"CIOA","siren":null,"capital":null,"nbEmploye":null,"adresse":null,"telephone":null,"email":"info@cioa.com","poids":0,"commentaire":null,"datAjout":"2013-01-27T12:04:28.193","statutEntrepriseID":2,"typeEntrepriseID":2},"statutAppelOffre":{"appelOffres":[],"ID":1,"libelle":"En Cours"},"budgets":[],"projectCommunicators":[],"factures":[],"source":{"appelOffres":[],"ID":1,"libelle":"En Cours","lien":null},"documents":[],"technologies":[],"cvs":[],"ID":9,"titre":"tire","pretention":999.0,"dateAjout":"2001-01-01T00:00:00","dateDebut":"2001-01-01T00:00:00","deadLine":"2001-01-01T00:00:00","dateLivraison":"2001-01-01T00:00:00","lienProjet":"test","entrepriseID":2,"statutAppelOffreID":1,"sourceID":1},{"appelOffreCommentaires":[],"entreprise":{"appelOffres":[{"appelOffreCommentaires":[],"statutAppelOffre":{"appelOffres":[],"ID":1,"libelle":"En Cours"},"budgets":[],"projectCommunicators":[],"factures":[],"source":{"appelOffres":[],"ID":1,"libelle":"En Cours","lien":null},"documents":[],"technologies":[],"cvs":[],"ID":9,"titre":"tire","pretention":999.0,"dateAjout":"2001-01-01T00:00:00","dateDebut":"2001-01-01T00:00:00","deadLine":"2001-01-01T00:00:00","dateLivraison":"2001-01-01T00:00:00","lienProjet":"test","entrepriseID":2,"statutAppelOffreID":1,"sourceID":1}],"statutEntreprise":null,"typeEntreprise":null,"personnes":[],"secteurActivites":[],"ID":2,"nom":"CIOA","siren":null,"capital":null,"nbEmploye":null,"adresse":null,"telephone":null,"email":"info@cioa.com","poids":0,"commentaire":null,"datAjout":"2013-01-27T12:04:28.193","statutEntrepriseID":2,"typeEntrepriseID":2},"statutAppelOffre":{"appelOffres":[],"ID":2,"libelle":"En Cours"},"budgets":[],"projectCommunicators":[],"factures":[],"source":{"appelOffres":[],"ID":2,"libelle":"En Cours","lien":null},"documents":[],"technologies":[],"cvs":[],"ID":10,"titre":"titre 2","pretention":888.0,"dateAjout":"2222-02-02T00:00:00","dateDebut":"2222-02-02T00:00:00","deadLine":"2222-02-02T00:00:00","dateLivraison":"2222-02-02T00:00:00","lienProjet":"test2","entrepriseID":2,"statutAppelOffreID":2,"sourceID":2}]
    Pour visualiser avec indentation copie colle dans cet outil par exemple : http://json.parser.online.fr/

    Et en activant le lazy loading effectivement il me retourne plus de choses, je trouve le comportement étrange pour avoir fait un service WCF je me souviens avoir désactivé le lazyloading et être obligé d'ajouter toutes les liaisons moi même (Include("entreprise").Include("entreprise.appelOffre") ) alors que là finalement j'arrive au même résultat avec simplement Include("entreprise") ??



    EDIT: j'ai fait le tour des option pour la sérialisation en json sans trop avancer... j'ai testé d'inclure aussi les appelOffre dans entreprise (Include("entreprise.appelOffre") ) et il n'y a aucune différence, avec ou sans il fait la même chose ... Pourquoi ?

    et pourquoi lorsque je n'inclue rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            // GET api/test
            public IEnumerable<appelOffre> GetappelOffres()
            {
                var appeloffres = db.appelOffres;
                return appeloffres.AsEnumerable();
            }
    Il ne m'inclue pas les entreprises, ni le statutAppelOffre etc ... ???

    et encore plus étrange, dans appelOffres.entreprise je ne retrouve que les appelOffres, le typeEntreprise par exemple est vide ???

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 35
    Points
    35
    Par défaut
    Je suis bloqué depuis longtemps sur ce problème ...

    Afin de vous donner plus d'informations pour m'aider, voici le contenu des classes présentes dans model1.tt (code généré par EF)

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    namespace DAL
    {
        using System;
        using System.Collections.Generic;
     
        public partial class appelOffre
        {
            public appelOffre()
            {
                this.appelOffreCommentaires = new HashSet<appelOffreCommentaire>();
                this.budgets = new HashSet<budget>();
                this.projectCommunicators = new HashSet<projectCommunicator>();
                this.factures = new HashSet<facture>();
                this.documents = new HashSet<document>();
                this.technologies = new HashSet<technologie>();
                this.cvs = new HashSet<cv>();
            }
     
            public int ID { get; set; }
            public string titre { get; set; }
            public Nullable<decimal> pretention { get; set; }
            public System.DateTime dateAjout { get; set; }
            public Nullable<System.DateTime> dateDebut { get; set; }
            public Nullable<System.DateTime> deadLine { get; set; }
            public Nullable<System.DateTime> dateLivraison { get; set; }
            public string lienProjet { get; set; }
            public int entrepriseID { get; set; }
            public int statutAppelOffreID { get; set; }
            public int sourceID { get; set; }
     
            public virtual ICollection<appelOffreCommentaire> appelOffreCommentaires { get; set; }
            public virtual entreprise entreprise { get; set; }
            public virtual statutAppelOffre statutAppelOffre { get; set; }
            public virtual ICollection<budget> budgets { get; set; }
            public virtual ICollection<projectCommunicator> projectCommunicators { get; set; }
            public virtual ICollection<facture> factures { get; set; }
            public virtual source source { get; set; }
            public virtual ICollection<document> documents { get; set; }
            public virtual ICollection<technologie> technologies { get; set; }
            public virtual ICollection<cv> cvs { get; set; }
        }
    }
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    namespace DAL
    {
        using System;
        using System.Collections.Generic;
     
        public partial class entreprise
        {
            public entreprise()
            {
                this.appelOffres = new HashSet<appelOffre>();
                this.personnes = new HashSet<personne>();
                this.secteurActivites = new HashSet<secteurActivite>();
            }
     
            public int ID { get; set; }
            public string nom { get; set; }
            public string siren { get; set; }
            public Nullable<decimal> capital { get; set; }
            public Nullable<long> nbEmploye { get; set; }
            public string adresse { get; set; }
            public string telephone { get; set; }
            public string email { get; set; }
            public Nullable<short> poids { get; set; }
            public string commentaire { get; set; }
            public System.DateTime datAjout { get; set; }
            public int statutEntrepriseID { get; set; }
            public int typeEntrepriseID { get; set; }
     
            public virtual ICollection<appelOffre> appelOffres { get; set; }
            public virtual statutEntreprise statutEntreprise { get; set; }
            public virtual typeEntreprise typeEntreprise { get; set; }
            public virtual ICollection<personne> personnes { get; set; }
            public virtual ICollection<secteurActivite> secteurActivites { get; set; }
        }
    }

    Il y a peut être à jouer ici.




    EDIT: Finalement je ne trouve pas de solution alors je contourne le problème,
    J'ai créé une classe DTOappelOffre et j'initialise comme cela :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
            // GET api/test
            public IEnumerable<DTOappelOffre> GetappelOffres()
            {
                //var appeloffres = db.appelOffres.Include(a => a.entreprise).Include(a => a.statutAppelOffre).Include(a => a.source);
     
     
                var DTOappelOffres = from c in db.appelOffres.Include(a => a.entreprise).Include(a => a.statutAppelOffre).Include(a => a.source)
                                     select new DTOappelOffre
                                     {
                                        ID=  c.ID,
                                        titre = c.titre,
                                        pretention = c.pretention,
                                        dateAjout = c.dateAjout,
                                        dateDebut = c.dateDebut,
                                        deadLine = c.deadLine,
                                        dateLivraison = c.dateLivraison,
                                        lienProjet = c.lienProjet,
                                        entrepriseID = c.entrepriseID,
                                        statutAppelOffreID = c.statutAppelOffreID,
                                        sourceID = c.sourceID,
     
                                        nomEntreprise = c.entreprise.nom,
                                        libelleStatutAppelOffre = c.statutAppelOffre.libelle,
                                        libelleSource = c.source.libelle
     
                                     };
     
                return DTOappelOffres.AsEnumerable();
            }
    Je demande votre avis en ce qui concerne les bonnes pratiques ? à savoir que c'est juste un entrainement pour moi donc je cherche à faire de la manière la plus propre.

    Merci à vous.

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/08/2013, 10h49
  2. [C#] Récupération des variables system...
    Par smyley dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/08/2005, 11h39
  3. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  4. Récupération des noms de champs d'une table
    Par Battomura dans le forum SQL
    Réponses: 2
    Dernier message: 24/03/2003, 10h00
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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