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 :

Entity Framework - Classe DAL générique?


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut Entity Framework - Classe DAL générique?
    Bonjour,

    j'ai une base de données SQL Server CE (bdd locale) concernant des films(table Movie, Actor, Director, etc.). J'essaie de mettre en place une couche d'accès aux données en appliquant le principe des DAL, BEL et BPL.

    Pour l’instant j'en suis à la couche DAL. Ça marche mais j'aimerais créer une classe générique et ça là que je bloque..

    Je vous montre la classe que j'ai pour l'instant:

    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
    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
     
    Public Class DALClass
     
        Private Property ObjContext As ObjectContext
        Private Property ObjSet As ObjectSet(Of EntityObject)
     
        'Initialize
        Public Sub Initialize(ByVal ObjSet As ObjectSet(Of EntityObject))
            Me.ObjSet = ObjSet
            ObjContext = ObjSet.Context
        End Sub
     
        'DeleteByID
        Public Function DeleteByID(ByVal ID As Integer) As Boolean
            Dim o = (From p In ObjSet Where p.ID = ID Select p).First '"p.ID" compile pas => "ID" n'est pas membre de System.Data.Objects.DataClasses.EntityObject
            ObjContext.DeleteObject(o)
            Return Update()
        End Function
     
        'Insert
        Public Function Insert(ByVal obj As Object) As Boolean
            ObjSet.AddObject(obj)
            Return Update()
        End Function
     
        'SelectAll
        Public Function SelectAll() As System.Collections.Generic.IEnumerable(Of Object)
            Return (From p In ObjSet Select p).ToList()
        End Function
     
        'SelectByID
        Public Function SelectByID(ByVal ID As Integer) As Object
            Return (From p In ObjSet Where p.ID = ID Select p).First '"p.ID" compile pas => "ID" n'est pas membre de System.Data.Objects.DataClasses.EntityObject
        End Function
     
        'Update
        Public Function Update() As Boolean
            Return ObjContext.SaveChanges() > 0
        End Function
     
    End Class
    A la base pour une DALMovie, on utilise un ObjectSet(Of Movie), Movie héritant de EntityObject, j'ai donc essayé de le remplacer par EntityObject mais "impossible de caster Movie en EntityObject" (de plus il n'y a pas de membre 'ID').. et maintenant je sais plus trop de quel coté chercher..

    Connaissez vous un moyen de faire ça?
    J’ai des questions à toutes vos réponses!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Pour récupérer l'ID il faut que tu regardes la propriété EntityKey de ton EntityObject

  3. #3
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Pour récupérer l'ID il faut que tu regardes la propriété EntityKey de ton EntityObject
    Merci pour ta réponse, j'avance à petit pas. J'ai explorer cet objet en mode debug et je vois où tu veux en venir.

    Est ce que je peux instancier ma DALClass comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dal_movie As New DALClass(Of Movie)(context)
    Ayant l'ObjectContext et l'EntityObject, j'imagine que l'on peut récupérer aussi l'ObjectSet et l'EntityKey ?!? Problème, je n'arrives pas à récupérer l'EntityObject dans ma DALClass, déclarée comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Class DALClass(Of EntityObject)
        '...
    End Class
    J’ai des questions à toutes vos réponses!

  4. #4
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    Bon j'ai pas mal avancé, j'ai même cru que je touchais au but.. J'obtiens une exception lors de la requête LINQ (dans SelectByID ou DeleteByID):

    Le type de nœud « ArrayIndex » de l'expression LINQ n'est pas pris en charge dans LINQ to Entities.
    Ma classe DALClass ressemble à ça maintenant:
    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
    Public Class DALClass(Of T As Class)
     
        Private Property ObjContext As ObjectContext
        Private Property ObjSet As ObjectSet(Of T)
        Private Property EntityKey As EntityKey
     
        'New
        Sub New(ObjContext As ObjectContext)
            Me.ObjContext = ObjContext
            Me.ObjSet = ObjContext.CreateObjectSet(Of T)()
            Dim Key = Me.ObjSet.EntitySet.ElementType.KeyMembers(0).Name
            Dim kvps As New List(Of KeyValuePair(Of String, Object))
            kvps.Add(New KeyValuePair(Of String, Object)(Key, 0))
     
            Me.EntityKey = New EntityKey(Me.ObjSet.EntitySet.ElementType.FullName, kvps)
        End Sub
     
        'SelectByID
        Public Function SelectByID(ByVal ID As Integer) As Object
            Dim r = From p In Me.ObjSet Where Me.EntityKey.EntityKeyValues(0).Key = ID Select p
            Return r.FirstOrDefault '<---Boum! Exception :p
        End Function
    '...
    Les objets (EntityKey, ObjSet, etc.) ont pourtant l'air de bien correspondre à ce que je souhaitais..
    Je continue mes recherches
    J’ai des questions à toutes vos réponses!

  5. #5
    Membre éclairé Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    J'ai finalement réussi, en fait j'avais mal cerné l'utilisation qu'il fallait avoir de l' EntityKey.. (voici le post qui m'a ouvert les yeux ^^)

    Voici à quoi ressemble ma classe DALClass désormais:
    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
    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
     
    Public Class DALClass(Of T As Class)
     
        Private Property ObjContext As ObjectContext
        Private Property ObjSet As ObjectSet(Of T)
     
        'New
        Sub New(ObjContext As ObjectContext)
            Me.ObjContext = ObjContext
            Me.ObjSet = ObjContext.CreateObjectSet(Of T)()
        End Sub
     
        'SelectByID
        Public Function SelectByID(ByVal ID As Integer) As T
            Dim obj As T = Nothing
            ObjContext.TryGetObjectByKey(GetEntityKey(ID), obj)
            Return obj
        End Function
     
        'SelectAll
        Public Function SelectAll() As System.Collections.Generic.IEnumerable(Of T)
            Return (From p In Me.ObjSet Select p).ToList()
        End Function
     
        'DeleteByID
        Public Function DeleteByID(ByVal ID As Integer) As Boolean
            Dim obj As T = Nothing
            If ObjContext.TryGetObjectByKey(GetEntityKey(ID), obj) Then
                Me.ObjContext.DeleteObject(obj)
                Return Update()
            Else
                Return False
            End If
        End Function
     
        'Insert
        Public Function Insert(ByVal obj As T) As Boolean
            Me.ObjSet.AddObject(obj)
            Return Update()
        End Function
     
        'Update
        Public Function Update() As Boolean
            Return Me.ObjContext.SaveChanges() > 0
        End Function
     
        'GetEntityKey
        Private Function GetEntityKey(ID As Integer) As Data.EntityKey
            Dim Key As String = Me.ObjSet.EntitySet.ElementType.KeyMembers(0).Name
            Dim qualifiedEntitySetName As String = Me.ObjSet.EntitySet.EntityContainer.Name + "." + Me.ObjSet.EntitySet.Name
            Dim entityKeyValues As New List(Of KeyValuePair(Of String, Object))({New KeyValuePair(Of String, Object)(Key, ID)})
            Return New EntityKey(qualifiedEntitySetName, entityKeyValues)
        End Function
     
    End Class
    et son utilisation :
    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
     
        Sub Main()
            Dim context As New ABW_DataBaseEntities
            Dim roles As New DALClass(Of Role)(context)
            Dim users As New DALClass(Of User)(context)
     
            'Suppression de tout les roles existants dans la base
            For Each r As Role In roles.SelectAll
                roles.DeleteByID(r.ID)
            Next
     
            'Suppression de tout les users existants dans la base
            For Each u As User In users.SelectAll
                users.DeleteByID(u.ID)
            Next
     
            'Creation d'un nouveau role
            Dim r1 As New Role With
                {
                    .ID = 0,
                    .Name = "Admin"
                }
            roles.Insert(r1)
     
     
            'Creation d'un nouveau user
            Dim u1 As New User With
                {
                    .ID = 0,
                    .Name = "Dupont",
                    .FirstName = "Jacques",
                    .ID_Role = 0
                }
            users.Insert(u1)
     
     
            'Selection du nom du role de chaque user existant dans la base
            For Each u As User In users.SelectAll
                Dim obj As Role = roles.SelectByID(u.ID_Role)
                MsgBox(obj.Name)
            Next
     
        End Sub
    Voilà une bonne chose de faite! Cette classe mérite encore d'être améliorée mais je pense que le plus dur est passé

    Merci encore à h2s84 pour m'avoir orienté vers la soluce.

    Si vous avez des questions sur le code n'hésitez pas..

    ++
    J’ai des questions à toutes vos réponses!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/11/2009, 18h02
  2. Entity framework et Classe générique
    Par mrkinfo dans le forum Windows Forms
    Réponses: 6
    Dernier message: 28/06/2009, 15h38

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