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 :

Entity Framework relationship et Entity State


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 Entity Framework relationship et Entity State
    Bonjour,

    J'ai créé un objet CommandeFournisseur qui est composé d'une collection d'objet de type CommandeFournisseurLigne.

    La collection est réalisé via EF de la manière suivante :

    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
       /// Aucune documentation sur les métadonnées n'est disponible.
            /// </summary>
            [XmlIgnoreAttribute()]
            [SoapIgnoreAttribute()]
            [DataMemberAttribute()]
            [EdmRelationshipNavigationPropertyAttribute("001Model", "CommandeFournisseurCommandeFournisseurLigne", "CommandeFournisseurLigne")]
            public EntityCollection<CommandeFournisseurLigne> CommandeFournisseurLignes
            {
                get
                {
                    return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CommandeFournisseurLigne>("EasiiDB_001Model.CommandeFournisseurCommandeFournisseurLigne", "CommandeFournisseurLigne");
                }
                set
                {
                    if ((value != null))
                    {
                        ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<CommandeFournisseurLigne>("001Model.CommandeFournisseurCommandeFournisseurLigne", "CommandeFournisseurLigne", value);
                    }
                }
            }

    Lorsque je modifie mon object CommandeFournisseur je peux faire ceci pour évaluer les objets modifiés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     List<ObjectStateEntry> Changes = new List<ObjectStateEntry>();
                Changes.AddRange(ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted)); // Deleted en premier pour les Messages
                Changes.AddRange(ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added));
                Changes.AddRange(ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified));

    Mon réel problème est dès que je modifie un des enregistrements de CommandeFournisseurLigne il n'y a que l'objet CommandeFournisseurLigne qui est considéré comme modifié mais pas l'objet CommandeFournisseur.

    Je ne sais donc pas s'il s'agit d'une option d'entity Framework ou s'il y a un autre moyen de gérer ça...

    Car lorsque je modifie mes lignes de commande sont modifiées j'aimerais que ma commande soit considérée comme modifié et donc générer mon mail.

    Je vous remercie d'avance pour l'aide précieuse que vous pourrez m'apporter.

  2. #2
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Bonjour,

    Une solution consiste à intercepter l'enregistrement des données modifiées notamment lors de la validation des éléments, exemple :

    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
        public partial class Model1Container : DbContext
        {
     
            // autres déclarations ici .....    
     
            public virtual DbSet<CdeFournisseur> CdeFournisseurSet { get; set; }
            public virtual DbSet<CdeFournisseurLigne> CdeFournisseurLigneSet { get; set; }
     
            protected override System.Data.Entity.Validation.DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, System.Collections.Generic.IDictionary<object, object> items)
            {
                // ajouter ici le code nécessaire, attention à ne pas créer de bouclage (appels récursifs)
                return base.ValidateEntity(entityEntry, items);
            }       
        }
    }
    Inconvenient : la CdeFournisseur est mise à jour que lorsque les lignes sont sauvegardées ( Ett.SaveChange() )

    Donc on peu imaginer implémenter une paire d'interface IObserver et IObservable qui va permettre de mettre à jour les entités en cascades, toutes les explications (avec un exemple très proche) sur MSDN
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

  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
    Je vais voir ce que je peux faire avec ce que tu m'a donné, mais je ne suis pas sûr d'avoir bien compris.

    Ce que je retiens principalement est le fait que je doit modifier mon model afin de changer la fonction ValidateEntity

    Il me vient donc une question, cette fonction n'est-elle pas utilisée par tout les autres objets de mon model ?


    De plus si je modifie la fonction, comment soulevez le fait que l'item père à changé ? Dois-je utiliser ReportPropertyChanged ?



    Merci pour tout.

  4. #4
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Lionhart Voir le message
    1. Ce que je retiens principalement est le fait que je doit modifier mon model afin de changer la fonction ValidateEntity

    2. Il me vient donc une question, cette fonction n'est-elle pas utilisée par tout les autres objets de mon model ?


    3. De plus si je modifie la fonction, comment soulevez le fait que l'item père à changé ? Dois-je utiliser ReportPropertyChanged ?
    1. oui en overridant la méthode : (ce qui n'est peut etre - sans doute - pas encore fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, System.Collections.Generic.IDictionary<object, object> items)
            {
                // ajouter ici le code nécéssaire, attention à ne pas créer de bouclage
                return base.ValidateEntity(entityEntry, items);
            }

    2. via les propriétés de navigation, on retrouve le parent de la relation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public partial class CdeFournisseurLigne
        {
            public int Id { get; set; }
            // dans la ligne, CdeFournisseur est la commande propriétaire de la ligne
            public virtual CdeFournisseur CdeFournisseur { get; set; }
        }
    3. pour faire en sorte que le ârent est modifié, le plus simple est de mettre un champ "Stamp" de type DateTime et de le positionner à DateTime.Now, ce qui va faire passer son état à "Modifié " .. et hop !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, System.Collections.Generic.IDictionary<object, object> items)
            {
     
                if (entityEntry.Entity is CdeFournisseurLigne)
                {
                    CdeFournisseurLigne temp = entityEntry.Entity as CdeFournisseurLigne;
                    temp.CdeFournisseur.Stamp = DateTime.Now;
                }
                return base.ValidateEntity(entityEntry, items);
            }
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/08/2011, 10h38
  2. ADO.NET Entity Framework, Astoria, Silverlight -> .NET 3.5 ?
    Par rad_hass dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/07/2008, 16h01
  3. version final d'Entity framework
    Par korchimustapha dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 04/07/2008, 17h21
  4. [ADO.NET Entity Framework] génération des tables
    Par anthyme dans le forum Accès aux données
    Réponses: 3
    Dernier message: 22/02/2008, 17h44
  5. Linq - Entity Framework
    Par Jfrancois57 dans le forum Framework .NET
    Réponses: 11
    Dernier message: 12/02/2008, 08h06

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