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 :

EntityFramework et relation


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut EntityFramework et relation
    Bonjour,

    Je me permets d'écrire sur le forum afin d'en savoir plus sur le sujet des relations avec EF.

    Par exemple je crée une relation Commande et Affaire.

    J'ai donc accès à Commande.Affaire car j'ai la propriété de navigation mais je dispose aussi de Commande.IDAffaire qui correspond à la relation (clé étrangère).

    Lorsque je veut modifier cette relation je peux modifier l'IDAffaire et la variable Commande.Affaire.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Commande.Affaire = new Affaire ("test"); // HasChange est à true
    Commande.IDAffaire = 10; // HasChange est à false
    Juste que mon DataContext ne se comporte pas de la même façon en fonction du choix effectuer et je ne comprends pas bien pourquoi.


    Ma variable HasChanges return true (dans le cadre de modif de Commande.Affaire) ou non (dans le cadre de modif de Commande.IDAffaire)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     public bool HasChanges
            {
                get
                {
                    int Count =
                    ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Count()+
                    ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted).Count()+
                    ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified).Count();
     
                    return Count > 0;
                }
            }
    Après je n'ai peut-être pas tout bien lu dans le code qui m'a été fourni...

    De plus lorsque je fais .Save cette variable est-elle censé me retourné true ou false ? (je pense false)


    Pour faire plus global quelle est la différence entre modifier Commande.Affaire ou Commande.IDAffaire ?

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Points : 158
    Points
    158
    Par défaut
    Ma variable HasChanges return true (dans le cadre de modif de Commande.Affaire) ou non (dans le cadre de modif de Commande.IDAffaire)
    Sur quoi utilise tu HasChanges au juste?

    Pour faire plus global quelle est la différence entre modifier Commande.Affaire ou Commande.IDAffaire ?
    Et bien ce ne sont pas les même propriétés.

    Affaire est une référence à un Objet Affaire je suppose. Tandis que IdAffaire est en référence à l'objet Commande.

    Maintenant, je ne connais pas très bien EF, mais je pense que si je n'ai pas bon (ce qui est probable), il faudrait pour les autres, que tu montres un peu plus, comment sont constituées tes classes.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur Junior développement logiciels
    Inscrit en
    Mai 2014
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Junior développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 198
    Points : 113
    Points
    113
    Par défaut
    Pour plus de détail jvais essayer de donner les classes en version simple.


    Alors ma Commande elle ressemble à ça (j'ai retiré le surperflu):

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
      public partial class CommandeFournisseurLigne : EntityObject
        {
            #region Méthode de fabrique
     
            /// <summary>
            /// Créez un nouvel objet CommandeFournisseurLigne.
            /// </summary>
            /// <param name="id">Valeur initiale de la propriété ID.</param>
            /// <param name="iDCommandeFournisseur">Valeur initiale de la propriété IDCommandeFournisseur.</param>
            /// <param name="description">Valeur initiale de la propriété Description.</param>
            /// <param name="prixUnitaire">Valeur initiale de la propriété PrixUnitaire.</param>
            /// <param name="quantite">Valeur initiale de la propriété Quantite.</param>
            public static CommandeFournisseurLigne CreateCommandeFournisseurLigne(global::System.Int32 id)
            {
                CommandeFournisseurLigne commandeFournisseurLigne = new CommandeFournisseurLigne();
                commandeFournisseurLigne.ID = id;
                return commandeFournisseurLigne;
            }
     
            #endregion
     
            #region Propriétés primitives
     
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.Int32 ID
            {
                get
                {
                    return _ID;
                }
                set
                {
                    if (_ID != value)
                    {
                        OnIDChanging(value);
                        ReportPropertyChanging("ID");
                        _ID = StructuralObject.SetValidValue(value);
                        ReportPropertyChanged("ID");
                        OnIDChanged();
                    }
                }
            }
            private global::System.Int32 _ID;
            partial void OnIDChanging(global::System.Int32 value);
            partial void OnIDChanged();
     
     
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
            [DataMemberAttribute()]
            public Nullable<global::System.Int32> IDAffaire
            {
                get
                {
                    return _IDAffaire;
                }
                set
                {
                    OnIDAffaireChanging(value);
                    ReportPropertyChanging("IDAffaire");
                    _IDAffaire = StructuralObject.SetValidValue(value);
                    ReportPropertyChanged("IDAffaire");
                    OnIDAffaireChanged();
                }
            }
            private Nullable<global::System.Int32> _IDAffaire;
            partial void OnIDAffaireChanging(Nullable<global::System.Int32> value);
            partial void OnIDAffaireChanged();
     
     
            #endregion
     
     
            #region Propriétés de navigation
     
     
     
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [XmlIgnoreAttribute()]
            [SoapIgnoreAttribute()]
            [DataMemberAttribute()]
            [EdmRelationshipNavigationPropertyAttribute("MYDB_001Model", "AffaireCommandeFournisseurLigne", "Affaire")]
            public Affaire Affaire
            {
                get
                {
                    return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Affaire>("MYDB_001Model.AffaireCommandeFournisseurLigne", "Affaire").Value;
                }
                set
                {
                    ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Affaire>("MYDB_001Model.AffaireCommandeFournisseurLigne", "Affaire").Value = value;
                }
            }
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [BrowsableAttribute(false)]
            [DataMemberAttribute()]
            public EntityReference<Affaire> AffaireReference
            {
                get
                {
                    return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Affaire>("MYDB_001Model.AffaireCommandeFournisseurLigne", "Affaire");
                }
                set
                {
                    if ((value != null))
                    {
                        ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Affaire>("MYDB_001Model.AffaireCommandeFournisseurLigne", "Affaire", value);
                    }
                }
            }
     
            #endregion
     
        }

    Ma classe Affaire :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
        /// <summary>
        /// Aucune documentation sur les métadonnées n'est disponible.
        /// </summary>
        [EdmEntityTypeAttribute(NamespaceName="MYDB_001Model", Name="Affaire")]
        [Serializable()]
        [DataContractAttribute(IsReference=true)]
        public partial class Affaire : EntityObject
        {
            #region Méthode de fabrique
     
            /// <summary>
            /// Créez un nouvel objet Affaire.
            /// </summary>
            /// <param name="id">Valeur initiale de la propriété ID.</param>
            /// <param name="numero">Valeur initiale de la propriété Numero.</param>
            /// <param name="libelle">Valeur initiale de la propriété Libelle.</param>
            /// <param name="synchroniser">Valeur initiale de la propriété Synchroniser.</param>
            /// <param name="iDAffectationSociete">Valeur initiale de la propriété IDAffectationSociete.</param>
            public static Affaire CreateAffaire(global::System.Int32 id, global::System.String numero)
            {
                Affaire affaire = new Affaire();
                affaire.ID = id;
                affaire.Numero = numero;
                return affaire;
            }
     
            #endregion
     
            #region Propriétés primitives
     
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.Int32 ID
            {
                get
                {
                    return _ID;
                }
                set
                {
                    if (_ID != value)
                    {
                        OnIDChanging(value);
                        ReportPropertyChanging("ID");
                        _ID = StructuralObject.SetValidValue(value);
                        ReportPropertyChanged("ID");
                        OnIDChanged();
                    }
                }
            }
            private global::System.Int32 _ID;
            partial void OnIDChanging(global::System.Int32 value);
            partial void OnIDChanged();
     
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
            [DataMemberAttribute()]
            public global::System.String Numero
            {
                get
                {
                    return _Numero;
                }
                set
                {
                    OnNumeroChanging(value);
                    ReportPropertyChanging("Numero");
                    _Numero = StructuralObject.SetValidValue(value, false);
                    ReportPropertyChanged("Numero");
                    OnNumeroChanged();
                }
            }
            private global::System.String _Numero;
            partial void OnNumeroChanging(global::System.String value);
            partial void OnNumeroChanged();
     
     
     
            #endregion
     
     
            #region Propriétés de navigation
     
            /// <summary>
            /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [XmlIgnoreAttribute()]
            [SoapIgnoreAttribute()]
            [DataMemberAttribute()]
            [EdmRelationshipNavigationPropertyAttribute("MYDB_001Model", "AffaireCommandeFournisseurLigne", "CommandeFournisseurLigne")]
            public EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes
            {
                get
                {
                    return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CommandeFournisseurLigne>("MYDB_001Model.AffaireCommandeFournisseurLigne", "CommandeFournisseurLigne");
                }
                set
                {
                    if ((value != null))
                    {
                        ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<CommandeFournisseurLigne>("MYDB_001Model.AffaireCommandeFournisseurLigne", "CommandeFournisseurLigne", value);
                    }
                }
            }
     
     
     
            #endregion
     
        }
    Par la suite j'arrive donc sur ma GUI avec ma commande et son numero d'affaire.

    Je le modifie donc avec l'une des 2 méthode mentionnées précedemment.


    Je réalise donc un Commande.Save et je change de gui par la suite via une fonction NaviguerVERS() qui réalise ceci (l'opération sur laquelle j'ai 2 résultats différents en fonction de la méthode utilisée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataAccess.EntitiesContext.Context.HasChanges
    Lorsque j'ai modifié l'IDAffaire la variable HasChanges est à false alors que si j'ai modifié Affaire elle est a true malgrè l'appel de Save.

    Le code est plus complexe que ça car il y a pas mal d'héritage et je vous fais part de ma version simplifiée.

Discussions similaires

  1. Mettre en relation les contrôles DBLookUpComboBox et DBGrid
    Par Gendarmette dans le forum Bases de données
    Réponses: 7
    Dernier message: 19/01/2004, 13h16
  2. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07
  3. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 14h26
  4. Réponses: 2
    Dernier message: 26/09/2003, 15h54
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 15h16

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