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 :

Où faire ces opérations?


Sujet :

Entity Framework

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 73
    Points
    73
    Par défaut Où faire ces opérations?
    Bonjour

    Ben en fait mes problèmes sont simple et plutôt d'ordre architectural.

    Mon contexte c'est WPF- MVVM et EF4. EF4 en ModelFirst.
    Pour la validation de mes données, j’ai fait des classes partielles sur mes entités et j’utilise IDataErrorInfo pour les erreurs « simples » (caractères autorisés, etc….).

    Si je prends par exemple mon entité famille, j’ai besoin que le nom de chaque famille soit unique. Ou faire cette vérification sachant que je n’ai pas forcément besoin de la faire à chaque fois que ma propriété change mais plutôt au moment de l'enregistrement (context.savechange). Je mets cette vérification dans le savechange ? Ca me semble crado (j’en ai une ribambelle du même genre) non ?

    Dans le même genre, si la famille est renommée, j’ai besoin de stocker l’ancien nom. Ou est ce que je fais cela ?
    J’ai fait beaucoup de biblio ces derniers temps mais j’arrive plu du tout à trouver où j’ai vu la solution (trop de biblio tue la biblio ) alors si qqu’un peut me donner la réponse, ce serait super. Merci d’avance.

    [edit] ajout au cas ou : mono utilisateur et pas de WCF

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Tu peux mettre une contrainte unique sur le champ nom de famille. Comme ça tu aura une exception à la sauvegarde que tu peux alors gérer.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 27
    Points : 73
    Points
    73
    Par défaut
    Ha bien oui c'est vrai merci, ca marchera bien pour mes cas "simples"

    Par contre j'en ai des un peut plus tordus. J'ai par exemple ma table avec des espèces. Chacune ayant un nom scientifique. Ce nom scientifique devant être unique. Mais on peut changer (éditer) ce nom en cas changement de nomenclature ou juste parce qu’on a réussi à mieux identifier le/les individus (passer d’un « générique » sp. à un nom précis).
    Comme on a besoin d'un certain suivi (là on tombe dans la contrainte "légale"), je stocke l’ancien nom. Je stocke l'ancien nom dans un autre champ (oui je garde juste le dernier ancien nom). J’ai donc besoin de contrôler le nouveau et l’ancien. Mais j’ai aussi besoin de contrôler que si un ancien nom est égal, cela ne doit pas causer d’erreur si c’est un nom sous la forme xxxxx sp.

    Au final pour le moment j’en suis à m’être abonné à l’évènement SavingChanges du contexte. Avec un code du genre

    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
            private void context_SavingChanges(object sender, EventArgs e)
            {
                ObjectContext context = sender as ObjectContext;
                if (context != null)
                {
                     foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
                    {
                        if (entry.Entity != null)
                        { 
                            if (entry.Entity.GetType()==typeof(Espece))
                            {
                                EspeceValidation(entry.Entity as Espece);
                            }
                        }
                    }
                }
            }
    Sachant que j'en ai encore plein à ajouter, ca me semble bien barbare comme solution

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Ce que tu peux faire, c'est créer un interface (IValidator, par exemple) avec une méthode Validate(ObjectStateEntry entry) et l'implémenter dans tes entités. Cet interface est appelé avant le save afin de valider.

    Ton save devient un truc style :
    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
     
     
    public interface IValidaotr
    {
       void Validate(ObjectStateEntry entry);
    }
     
    public partial class Espece : IValidator
    {
       public void Validate(ObjectStateEntry entry)
       {
          if (entry == EntityState.Added)
         {
           ....
         }
         .....
       }
     
    }
     
     
    // dans méthode Save :
     
     var entries = ObjectManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified).Where(e => d.Entity is IValidator);
     
    foreach (var entry in entries)
    {
    var entity = entry.Entity as IValidator;
    var entity.Validate(entry)
    }
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

Discussions similaires

  1. Quels fonctions pour ces opérations sur le réseau ?
    Par Pierre.g dans le forum Windows
    Réponses: 4
    Dernier message: 13/01/2007, 12h49
  2. Comment faire l'opération inverse des champs de galois ?
    Par jabrane198 dans le forum MATLAB
    Réponses: 4
    Dernier message: 08/01/2007, 12h36
  3. Faire des opérations réelles avec bash ?
    Par Michaël dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 01/09/2006, 15h59
  4. faire des opérations sur la date courante
    Par transistor49 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/04/2006, 17h39
  5. Réponses: 7
    Dernier message: 02/03/2006, 13h43

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