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

Silverlight Discussion :

Silverlight 4 , LINQ et Entity Framework, mode d'emploi ?


Sujet :

Silverlight

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Silverlight 4 , LINQ et Entity Framework, mode d'emploi ?
    Bonjour à tous.

    Bon je plante vite fait le décors.
    Je suis amené pour mon boulot à développer un gros (même très gros) projet de type RIA, et j'ai tout de suite saisi l'occasion pour me jeter sur Silverlight, qui me faisait de l'oeil depuis longtemps.

    En bon dévelopeur winform bien de chez nous, j'ai également du me mettre au XAML que je ne connaissais pas, et d'ailleurs je me demande comment j'ai fait pour passer à coté de cette merveilleuse techno aussi longtemps.
    En ce qui concerne la couche d'accés au données j'ai opté pour Entity framework, que je decouvre également mais vu que j'ai déjà travaillé avec d'autres ORM ca va plus ou moins.
    Ha oui, j'ai du me mettre au LINQ également, quelle merveille !!!
    Enfin bref, c'est beaucoup de nouveauté d'un seul coup pour moi, et bon dieu que ca fait du bien !
    Je suis encore en pleine phase d'analyse, donc je peux me permettre de prendre le temps de comprendre les choses, seulement il y à quand même un truc qui m'ennerve depuis quelques jours.


    J'explique :
    J'ai une application Silverlight 4, qui tourne avec VS 2010.
    Aucun problème pour la création de mon fichier edmx, aucun problème non plus pour la création de ma domain service class.
    Aucun problème pour peupler un datagrid via WCF RIA services par exemple, j'arrive même à appliquer des filtre avec LINQ sur ma grid.
    Tout ca ca roule.

    Le problème c'est que je ne veux pas récuperer une collection d'entité et les mettre dans un grid, je veux juste récuperer une et une seule instance (d'une entité Employee plus exactement), et travailler dessus.
    Pour le moment mon appli s'est arretée à l'écran de login (pfff je sais c'est la honte), ce que je cherche à faire c'est classique de chez classique pourtant, une query sur base d'un login et password, et normalement je suis censé récuperé un seul resultat, mais comment ?
    Ou dois'je placer mon code pour y arriver, du coté client ? coté serveur dans ma class domain service ?

    J'ai essayé pleins de truc pourtant, là je suis perdu, je me suis mangé des heures de webcasts, des tutos à gogo, et y'a rien qui marche, pourtant je suis sur que c'est un truc tout bete.

    Si une ame charitable pouvait éclairé ma lanterne.

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Théoriquement une simple requète linq devrait suffire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Users.Where(user => user.Name == "toto").First()

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Dans ta classe RIA côté serveur rajoute une méthode qui te retourne ton seule et unique User en fonction (ou pas) de paramètre. Elle sera répliquée dans le code côté Silverlight et tu pourra l'appeler.

    Le code côté serveur ressemblera à un truc du genre

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public User GetUser(string username, string password)
    {
       var context = new MonDataContext();
       return context.Users.FirstOrDefault(u => u.UserName == username && u.Password == password);
    }

    A noter qu'il existe un système d'authentification intégré.
    http://leeontech.wordpress.com/2009/...-ria-services/
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Tout d'abord les gars je tiens à vous remercier pour vos réponses fulgurantes, je savais que developpez.com était un site réactif mais pas à ce point !

    meziantou :

    J'ai essayé ta méthode, qui me semblait la plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DPDomainContext context = new DPDomainContext();
     
    var employee = context.Employees.Where(e => e.Login== CurrentUserCredentials.Login && e.Password == CurrentUserCredentials.Password).First();
    Voici le message d'erreur que j'obtient :
    "Sequence contains no elements !"
    Or je suis sur et certains que dans ma DB il y à bien une row avec un login et mot de passe correspondant, le problème ne vient donc pas de là.
    Pourquoi est-ce que je ne récupère rien ?
    Alors je me dit que sans doute mon EntitySet Employees est vide, et je rajoute ce bout de code juste avant ma query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.Load(context.GetEmployeeSetQuery());
    Mais çà ne change absolument rien.
    Toujours le même message d'erreur.

    Skyounet :

    Comme suggeré j'ai rajouté une méthode dans ma classe DPDomainService : LinqToEntitiesDomainService<DPNETModelContainer> (coté serveur donc, pour ceux qui prendraient la discussion en route ).

    la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Employee GetEmployee(string Login, string Password)
            {
                var context = new DPDomainService();
                return context.GetEmployeeSet().FirstOrDefault(e => e.Login == Login && e.Password == Password);
                
            }
    Je précise qu'à ce niveau je n'avais pas accés à mon EntitySet Employee, j'ai donc du utilisé la méthode GetEmployeeSet() (en rouge) pour que ca compile...
    J'ai trouvé ca bizarre.

    Coté client voici l'appel que je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var employee = context.GetEmployeeQuery(CurrentUserCredentials.Login, CurrentUserCredentials.Password);
    Le problème est que malgré le fait que coté serveur je renvoi un objet de type Employee (en vert) , coté client je ne récupère qu'une EntityQuery !
    Donc impossible d'acceder aux précieuses proprietés de mon objet Employee dont j'ai besoin.
    Alors je me doute bien qu'il doit y avoir un cast à faire quelque part mais ou ? et comment ?

    En tout cas merci les gars pour votre aide précieuse.

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Une fois que tu as ton entityQuery il faut appeler sa méthode Load (ou un truc du genre) et t'abonner à son evenement Completed (ou un truc du genre ).
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bon les gars , aprés moultes recherches sur google et quelques injures bien sonores (qui a mon avis ont fait le tour de la profession) j'ai réussi à trouver un ch'tit bout de code qui m'a apporter l'illumination.
    Effectivement, comme je le craignais c'était tout con.

    (si jamais ca interesse des gens voici le lien : http://stackoverflow.com/questions/1...r-getobjectkey)

    Allez je vais être sympa je vais expliquer en détail pour les autres 'apprentis silverlight' comme moi qui rencontreront le problème.

    D'abord je déclare en tant que membre de ma classe "LoginPage" le context suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private DPDomainContext context = new DPDomainContext();
    Puis dans le constructeur de ma page j'execute la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.Load(context.GetEmployeeSetQuery());
    Je précise que ces deux points sont super importants.
    Si je les déplace ailleurs, par exemple au moment d'un click bouton, ca plante ou je n'ai aucun résultat retourné.

    Donc je disais, au moment du click fatidique sur le bouton submit j'appelle ma méthode 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
            private void SubmitCredentials()
            {
                Employee employee = (from e in context.Employees
                                    where e.Login == CurrentUserCredentials.Login && e.Password == CurrentUserCredentials.Password
                                    select e).FirstOrDefault();
     
                if (employee != null)
                {
                    // go to home page
                }
                else
                {
                    // show error message
                }
            }
    Et voilà !

    (Pour ceux que celà turlupine CurrentUserCredentials est simplement une instance de ma classe UserCredentials, objet dans lequel j'encapsule les données saisies au moment du log).

    Quelle belle communauté que celle des devellopeurs n'est ce pas ?

    A bientôt.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par yo1-5590 Voir le message
    Si je les déplace ailleurs, par exemple au moment d'un click bouton, ca plante ou je n'ai aucun résultat retourné.
    En fait ça doit marcher si tu fais comme j'ai dit dans mon précédent post (même si j'avais tout de travers )

    Dans ton Submit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.Load(context.GetEmployeeSetQuery()).Completed += ...
    NB : Je suis pas sûr du nom de Completed.

    Et dans la callback ... tu mets ton code.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci Skyounet.

  9. #9
    Membre actif Avatar de chris81
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 626
    Points : 298
    Points
    298
    Par défaut
    Salut yo1-5590, tu dev en suivant le pattern mvvm ?

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

Discussions similaires

  1. Question Entity Framework et Silverlight
    Par wil4linux dans le forum Entity Framework
    Réponses: 4
    Dernier message: 27/04/2010, 23h43
  2. Architecture : Silverlight - WCF - Entity Framework
    Par darkfrag dans le forum Silverlight
    Réponses: 6
    Dernier message: 02/12/2009, 17h52
  3. [Entity Framework] Insertion de donnée avec LINQ to Entities
    Par Leelith dans le forum Framework .NET
    Réponses: 15
    Dernier message: 05/11/2009, 22h56
  4. 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
  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