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

  1. #1
    Candidat au Club
    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
    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
    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/
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Candidat au Club
    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
    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 ).
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  6. #6
    Candidat au Club
    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/1049850/retrieve-single-entity-framework-entities-using-a-linq-query-or-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
    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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  8. #8
    Candidat au Club
    Merci Skyounet.

  9. #9
    Membre actif
    Salut yo1-5590, tu dev en suivant le pattern mvvm ?

###raw>template_hook.ano_emploi###