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

C# Discussion :

[EF] Problème avec le lazy loading


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 41
    Points : 33
    Points
    33
    Par défaut [EF] Problème avec le lazy loading
    Bonjour à tous,
    J'ai un problème avec le lazy loading. J'ai une entité Client qui possède une ref à une entité Address. Voici la structure de ses classes :

    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
    43
    44
    45
    46
    47
     
    //Interface entité
        public interface IBaseEntity
        {
            int? Id { get; set; }
            DateTime? Versioning { get; set; } 
        }
     
    //Classe de base pour les entités
        [Serializable]
        public class BaseEntity : IBaseEntity
        {
            [Key]
            [Column("Id")]
            public int? Id { get; set; }
     
     
            [ConcurrencyCheck]
            [Column("Versioning")]
            public DateTime? Versioning { get; set; }
     
            public IBaseEntity Deepclone()
            {
                using (var ms = new MemoryStream())
                {
                    var formatter = new BinaryFormatter();
                    formatter.Serialize(ms, this);
                    ms.Position = 0;
                    return (IBaseEntity) formatter.Deserialize(ms);
                }
            }
        }
     
        [Table("clients")]
        [Serializable]
        public class Client : PersonalInformation
        {
            [Required]
            [MaxLength(32)]
            [Column("CompanyName")]
            public string CompanyName { get; set; }
     
            [Column("address_id")]
            public int? BillingAddressId { get; set; }
     
            [ForeignKey("BillingAddressId")]
            public virtual Address BillingAddress { get; set; }


    Et lorsque je crée un client avec un formulaire WPF, le champ BillingAddress ne se met pas à jour (d'ailleurs il n'est même pas initialiser). Ce problème se règle lorsque j'initialise ma propriété Client comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var currentClient = new Client { BillingAddress = new Address() };
    Je sais que ça vient du fait que le champ est en virtual pour respecter le lazy loading. Mais comment faire pour que le champ BillingAddress soit initialiser et bindable dès la création de la propriété currentClient sans devoir initialiser le champ ? Faut-il l'initaliser dans le constructeur de la classe Client ? (Mais dans ce cas là, est-ce qu'il n'y a pas un problème au niveau des performances ?) Ou y a-t-il une solution plus adapté ?

    Merci d'avance pour votre aide =)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sam1989 Voir le message
    ... Ce problème se règle lorsque j'initialise ma propriété Client comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var currentClient = new Client { BillingAddress = new Address() };
    C'est normal. le Lazy Loading (chargement différé) veut dire en résumé que tu as une donnée déjà existante en base de données et qu'EF te les charge automatiquement lorsque tu en feras la demande. Dans ton cas il s'agit d'une nouvelle donnée créée en mémoire inexistante en base de données donc logique que BillingAddress soit null au départ. De toute façon comment veux-tu que EF puisse charger cette donnée ?

    Citation Envoyé par sam1989 Voir le message
    Mais comment faire pour que le champ BillingAddress soit initialiser et bindable dès la création de la propriété currentClient sans devoir initialiser le champ ? Faut-il l'initaliser dans le constructeur de la classe Client ? (Mais dans ce cas là, est-ce qu'il n'y a pas un problème au niveau des performances ?) Ou y a-t-il une solution plus adapté ?
    Si tu utilises les templates T4 alors tu pourras modifier la façon dont sont générés les constructeurs de tes entités pour qu'à chaque fois que tu fais appel au constructeur par défaut de ton entité que celui-ci initialise en même temps BilingAddress. Bref si tu n'as jamais utilisé T4 alors je te conseille de créer une classe partielle de Client et tu fais pareil pour le constructeur.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    [...] Si tu utilises les templates T4 alors tu pourras modifier la façon dont sont générés les constructeurs de tes entités pour qu'à chaque fois que tu fais appel au constructeur par défaut de ton entité que celui-ci initialise en même temps BilingAddress. Bref si tu n'as jamais utilisé T4 alors je te conseille de créer une classe partielle de Client et tu fais pareil pour le constructeur.
    Merci pou votre réponse

    Mais si je modifie le constructeur par défaut de mon entité Client pour initialiser le champ BillingAddress, ça voudrait dire que le champ sera initialisé même lorsque je fais par exemple un repository<Client>.GetAll(), non ?
    Dans ce cas, il n'y a pas de perte de performance ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sam1989 Voir le message
    ... ça voudrait dire que le champ sera initialisé même lorsque je fais par exemple un repository<Client>.GetAll(), non ?
    Dans ce cas, il n'y a pas de perte de performance ?
    Depuis quand appeler un constructeur par défaut pose problème de performances ? À moins que tu fasses trop de trucs dans celui BillingAddress. Je te laisse faire le benchmark pour nous en dire plus

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 41
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Depuis quand appeler un constructeur par défaut pose problème de performances ? À moins que tu fasses trop de trucs dans celui BillingAddress. Je te laisse faire le benchmark pour nous en dire plus
    Oui vous avez raison ^^" désolé pour cette question, mon projet de fin d'année me rend un peu dingue x)

    Je vais clore le topic (et rajouter des petits "+1" pour votre aide)

    Merci encore

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

Discussions similaires

  1. Problème de Performance + lazy load
    Par valarko dans le forum Hibernate
    Réponses: 0
    Dernier message: 30/01/2012, 16h10
  2. Problème avec le lazy loading
    Par Arsenic68 dans le forum Entity Framework
    Réponses: 0
    Dernier message: 07/07/2010, 15h51
  3. [1.x] Problème avec un data-load
    Par cacahuete85 dans le forum Symfony
    Réponses: 9
    Dernier message: 17/06/2009, 23h27
  4. problème avec load data local
    Par afrikha dans le forum Débuter
    Réponses: 2
    Dernier message: 28/10/2005, 18h36
  5. Problème avec LOAD DATA INFILE
    Par ka0z dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 04/06/2004, 14h59

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