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

VB.NET Discussion :

Validation / DataAnnotation/EF.. [Débutant]


Sujet :

VB.NET

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 Validation / DataAnnotation/EF..
    Bonjour
    Je reviens vers vous suite au Post que j'avais entamé il y a quelques temps
    http://www.developpez.net/forums/d12...ation-classes/

    Après pas mal de recherches, je n'arrive pas à m'en sortir
    -J'ai crée mon modèle avec EF 4.0
    -J'ai généré mes classes (partielles) avec ADO.NET EndityObject Generator
    Je croyais pouvoir ajouter les métadonnées désirées en surchargeant les propriétés de mes classes partielles générées par EF, mais si j'ai bien compris ce n'est pas possible en vb
    Une solution que j'ai trouvée sur le Net consiste à recréer une nouvelle classe "parallèle" pour chaque classe crée, mais EF n'a alors plus aucun intérêt.

    Je n'arrive pas à trouver d'exemple complet en VB, et malgré les traducteurs en ligne, je n'arrive pas à transposer ceux trouvés en C#
    Un lien vers un tuto ou un exemple serait le bienvenu
    Par avance, merci
    Bertrand

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Sans utilser Ef. (je ne l'ai pas) J'ai fait un test juste pour l'utilisation en WinForm.

    En traduisant la classe de validation présenté sur ce site
    http://www.codeproject.com/Articles/...n-for-Beginner

    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
    Imports System.ComponentModel.DataAnnotations
     
    Public Class EntityValidationResult
        Public Property Errors() As IList(Of ValidationResult)
            Get
                Return m_Errors
            End Get
            Private Set(ByVal value As IList(Of ValidationResult))
                m_Errors = value
            End Set
        End Property
     
        Private m_Errors As IList(Of ValidationResult)
        Public ReadOnly Property HasError() As Boolean
            Get
                Return Errors.Count > 0
            End Get
        End Property
     
        Public Sub New(Optional ByVal errors__1 As IList(Of ValidationResult) = Nothing)
            Errors = If(errors__1, New List(Of ValidationResult)())
        End Sub
    End Class
     
    Public Class EntityValidator(Of t)
        Public Function Validate(ByVal entity As t) As EntityValidationResult
            Dim validationResults = New List(Of ValidationResult)()
            Dim vc = New ValidationContext(entity, Nothing, Nothing)
            Dim isValid = Validator.TryValidateObject(entity, vc, validationResults, True)
     
            Return New EntityValidationResult(validationResults)
        End Function
    End Class
     
    Public Class ValidationHelper
        Public Shared Function ValidateEntity(Of t)(ByVal entity As t) As EntityValidationResult
            Return New EntityValidator(Of t)().Validate(entity)
        End Function
    End Class
    En plaçant les annotations sur une de mes 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
    Imports System.ComponentModel.DataAnnotations
     
    ''' <summary> Classe représentant les données pour une journée de travail. </summary>
    Public Class clsDataJour
     
        Private mLibelle As String
        <Display(Name:="Libellé")> <Required()> <StringLength(50, ErrorMessage:="Le Libellé ne peut excéder 50 caractéres")>
        Public Overloads Property Libelle As String
            Get
                Return mLibelle
            End Get
            Set(ByVal value As String)
                mLibelle = value
            End Set
        End Property
     
        Private mAbreviation
        <Display(Name:="Abréviation")> <Required()> <StringLength(8, ErrorMessage:="L'Abréviation ne peut excéder 8 caractéres")>
        Public Overloads Property Abreviation As String
            Get
                Return mAbreviation
            End Get
            Set(ByVal value As String)
                mAbreviation = value
            End Set
        End Property
     
        ' ....
    dans ma form l'erreur est bien prise en compte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim DonneesJour As clsDataJour = New clsDataJour()
     
            DonneesJour.Libelle = "Suivi d'une journée."
            DonneesJour.Abreviation = "SuiviJour" 'trop long
     
            Dim validationResult = ValidationHelper.ValidateEntity(Of clsDataJour)(DonneesJour)
     
            If validationResult.HasError Then MsgBox(validationResult.Errors(0).ErrorMessage, vbInformation) ' A gérer suivant les besoins
     
        End Sub
    Espérant que cet exemple pourras te servir et que tu pourras l'adapter à tes besoins.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  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
    Bonjour Hervé et grand merci !
    Concernant EF, je crois "qu'on l'a tous" (en tout cas, on l'a avec MS Visual Basic Express 2010) c'est que j'ai appris avec le précédent post sus cité
    Merci beaucoup, j'ai de quoi "cogiter"
    Le pb que j'ai rencontré est que EF génère des classes partielles telles que

    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
    Public Partial Class Civilite
        Inherits EntityObject
     
    Public Property Abreviation() As Global.System.String
            Get
                Return _Abreviation
            End Get
            Set
                OnAbreviationChanging(value)
                ReportPropertyChanging("Abreviation")
                _Abreviation = StructuralObject.SetValidValue(value, true)
                ReportPropertyChanged("Abreviation")
                OnAbreviationChanged()
            End Set
        End Property 
     
    End class
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Private Partial Sub OnAbreviationChanging(value As Global.System.String)
        End Sub
    J'ai donc crée un autre partial class civilite
    Je peux surcharger OnAbreviationChanging par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub OnAbreviationChanging(value As Global.System.String)
            If value.Length > 8 Then
                Debug.WriteLine("Abréviation > 8")
     
            End If
        End Sub
    Mais je ne peux pas surcharger une propriété pour y ajouter les meta données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        <Display(Name:="Abréviation")> <Required()> <StringLength(8, ErrorMessage:="L'Abréviation ne peut excéder 8 caractéres")>
            Public Overloads Property abreviation As String
    me donne comme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property 'abreviation' définit implicitement '_abreviation', qui est en conflit avec un membre portant le même nom dans class 'Civilite'
    Du coup, je ne comprends plus l’intérêt d'EF
    Merci encore, je vais creuser ton exemple de code
    Bertrand






    La clas

  4. #4
    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,
    Pour ajouter les métadonnées à la main, j'ai trouvé ça :
    http://msdn.microsoft.com/en-us/libr...=vs.91%29.aspx
    Cela me parait encore lourd, et il ne faut pas se tromper dans les propriétés Y aurait il un moyen de générer cela automatiquement, ces infos existant déjà dans le modèle ?
    Bertrand

  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
    Bonsoir,
    La solution proposée par Hervé marche trés bien si j'ajoute les MetaData directement dans la classe générée par EF (mais je perdrai mes ajouts à chaque réactualisation de celui ci)
    Par contre, si je les ajoute dans une classe partielle via la méthode exposée sur msdn, ça ne marche pas !
    A+
    Bertrand

  6. #6
    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
    Bonjour,
    A priori la propagation des metadata ne se fait pas automatiquement
    Il faut la forcer comme indiqué à
    http://blogs.msdn.com/b/davidebb/arc...amic-data.aspx
    cela marche, j'ai bien une validation selon les metadata
    Mais l'ensemble ne me plait pas : beaucoup de code à rajouter pour chaque classe, la possibilité d'erreurs et surtout si les caractéristiques de la BDD changent, il faut tout remodifier à la main les metadata
    A+
    Bertrand

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

Discussions similaires

  1. DataAnnotation, ModelState toujours valide
    Par redkan dans le forum ASP.NET MVC
    Réponses: 5
    Dernier message: 17/11/2010, 12h22
  2. validation d'un XML schema
    Par nicolas_jf dans le forum Valider
    Réponses: 2
    Dernier message: 05/05/2003, 11h25
  3. est ce un XSchema Valide?
    Par Slash dans le forum Valider
    Réponses: 4
    Dernier message: 06/03/2003, 14h01
  4. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54
  5. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46

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