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 :

Test unicité EF5 [Débutant]


Sujet :

Entity Framework

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut Test unicité EF5
    Bonjour,
    J'aimerais tester mes enregistrements avant de les envoyer dans SQL Server et éviter les doublons
    Je n'ai pas trouvé de fonction pour cela dans EF5, et j'ai donc repris un code trouvé dans un bouquin en surchargeant la validation pour chaque classe

    Code vb.net : 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
       Protected Overrides Function ValidateEntity(ByVal entityEntry As Entity.Infrastructure.DbEntityEntry, ByVal items As IDictionary(Of Object, Object)) As DbEntityValidationResult
            Dim result = New DbEntityValidationResult(entityEntry, New List(Of DbValidationError)())
            ' les tests par propriété sont réalisés dans la classe
            ' A priori Nullable et Maxlenght sont gérés par par EF
     
            ''test unicité du libellé -> ce test ne doit être effectué que si EntityState.Added, sinon erreur dès modification, le test est fait sur base locale (plusieurs lignes ss enregistrement) et distante
            '' Pb si on teste également les modified  car leur type devient proxy :
            ' exemple : HistoAction -> System.Data.Entity.DynamicProxies.HistoAction_33F4B4452EB9B48D8D7617671B4CD5EBC47CCA7C366ABBECC1DB08FD54CC99C8
     
            If entityEntry.State = EntityState.Added Then
     
                NomClasse = entityEntry.Entity.GetType.Name
     
                Select Case entityEntry.Entity.GetType
     
                    Case GetType(Activite)
                        Dim Act As Activite = TryCast(entityEntry.Entity, Activite)
                        'test unicité du libellé
                        IDDoublon = Act.ActiviteID
                        CritereDoublon = Act.Libelle
                        NbreOccuranceLocal = Activites.Local.Where(Function(l) l.Libelle = Act.Libelle).Count()
     
                        If NbreOccuranceLocal > 1 Then
                            result.ValidationErrors.Add(New Entity.Validation.DbValidationError(MessageErreurDebut, "Doublon : Le libellé doit être unique, Nombre Occurances locales = " & NbreOccuranceLocal))
                        Else
                            NbreOccuranceBase = Activites.Where(Function(l) l.Libelle = Act.Libelle).Count()
                            If NbreOccuranceBase > 0 Then
                                result.ValidationErrors.Add(New Entity.Validation.DbValidationError(MessageErreurDebut, "Doublon : Le libellé doit être unique, Nombre Occurances dans base = " & NbreOccuranceBase + 1))
                            End If
                        End If
     
    ' et ainsi de suite pour chaque classe à tester
     
                    Case Else
                        result.ValidationErrors.Add(New Entity.Validation.DbValidationError("Non retrouvé dans Select Case de PhilaEntities !", "Validation de la classe " & entityEntry.Entity.GetType.ToString & " non effectuée !"))
                End Select
     
            End If
     
     
            If result.ValidationErrors.Count > 0 Then
                Return result
            Else
                Return MyBase.ValidateEntity(entityEntry, items)
            End If
       End Function

    ce code marche très bien pour tout ajout (EntityState.Added) mais pas pour les modifications (EntityState.modified) car les GetType ne "fonctionnent plus" , exemple erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Data.Entity.DynamicProxies.HistoAction_33F4B4452EB9B48D8D7617671B4CD5EBC47CCA7C366ABBECC1DB08FD54CC99C8
    Je pense que cela est du aux POCO
    Comment contourner ce problème, ou autre moyen de tester l'unicité ?
    par avance, merci
    Bertrand

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Data.Entity.DynamicProxies.HistoAction_33F4B4452EB9B48D8D7617671B4CD5EBC47CCA7C366ABBECC1DB08FD54CC99C8
    Je pense que cela est du aux POCO
    Comment contourner ce problème, ou autre moyen de tester l'unicité ?
    Dans ce cas il va falloir désactiver le proxy DbContext.Configuration.ProxyCreationEnabled = false;. Il faut noter qu'en désactivant le proxy cela désactive le Lazy Loading.

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Re bonjour et merci pour la réponse,
    Puis je désactiver le proxy rien que durant cette cette phase de validation ?
    Ou sinon, comment fait on "habituellement" pour tester l'unicité ?
    Par avance, merci
    Bertrand

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    Re bonjour et merci pour la réponse,
    Puis je désactiver le proxy rien que durant cette cette phase de validation ?
    Non. Tu dois désactiver le proxy avant chargement/modification des entités.

    Citation Envoyé par 105rn2 Voir le message
    Ou sinon, comment fait on "habituellement" pour tester l'unicité ?
    2 solutions que je connais peut-être il y en a d'autres :
    • Faire une requête Linq to Entities ou une procédure stockée (si la requête est complexe. La procédure stockée sera par la suite importée dans ton modèle) pour vérifier l'inexistence de la donnée concernée
    • Si l'unicité concerne d'autre colonnes autre que celle représentant la clef primaire alors ajouter une contrainte d'unicité au niveau de la base de donnée en spécifiant les colonnes concernées.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Re,
    je préfère garder les proxy (j'utilise le lazzy loading)
    Dans ma base SQL Server, j'ai crée mes contraintes d'unicité sur les champs qui ne sont pas des clés primaires (mes clés primaires sont toutes des IDxx)
    Le code que j'utilise vérifie pour les éléments ajoutés leur présence éventuelle dans la base locale et celle distante via requete Linq (toujours simple) mais ne marche pas pour des éléments modifiés
    Si je veux anticiper une exception de ma base SQL Server, ou puis je mettre mon test d'unicité : dans la classe elle même ?
    Merci encore de votre aide
    Bertrand

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 105rn2 Voir le message
    Le code que j'utilise vérifie pour les éléments ajoutés leur présence éventuelle dans la base locale et celle distante via requete Linq (toujours simple) mais ne marche pas pour des éléments modifiés
    Bizarre... Y a-t-il un message d'erreur ?

    Citation Envoyé par 105rn2 Voir le message
    Si je veux anticiper une exception de ma base SQL Server, ou puis je mettre mon test d'unicité : dans la classe elle même ?
    Soit
    • Je redéfini ou crée une surcharge de la méthode SaveChanges de mon contexte
    • Je crée une méthode d’extension de mon contexte
    • Je crée une classe dérivant de mon contexte et qui implémente une nouvelle méthode


    Quel que soit ton choix, la nouvelle méthode devra d'abord faire appel à ta fonction de test d'unicité.

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

Discussions similaires

  1. [AJAX] Test d'unicité d'une valeur
    Par medessad dans le forum AJAX
    Réponses: 4
    Dernier message: 04/07/2012, 17h09
  2. [eZ Publish] Test l'unicité de la valeur d'un champs dans la base de contenu d'eZ
    Par tic_29 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 27/10/2009, 15h02
  3. Script test de deux chaine avec if
    Par kacedda dans le forum Linux
    Réponses: 6
    Dernier message: 02/05/2003, 15h38
  4. [XMLRAD] test de nullité
    Par Pm dans le forum XMLRAD
    Réponses: 5
    Dernier message: 29/11/2002, 10h57
  5. test collisions
    Par tatakinawa dans le forum OpenGL
    Réponses: 5
    Dernier message: 08/06/2002, 06h03

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