Bonjour à tous et à toutes.
Je réalise une application basée sur Entity Framework Code first.
Jusque là, pas de problèmes.
J'ai découpé mon projet en différentes librairies :
DTO (Data Transfer Objects) / DAL (Data Object Layer) / Puis l'application découpée en MVVM avec MVVM Light.
En (très) gros, DTO contient les classes.
DAL contient les accesseurs aux tables (liste de classes du DTO).
L'application se charge de gérer la base.
Le problème que j'ai actuellement, c'est que via le DAL, je récupère des listes de ObservableCollection
Exemple : La classe DTO : EntityProfile qui contient un nom, une description, un type de profile.
Un classe DAL qui peut récupérer la liste des profiles :
La fonction DatabaseManagerContext.CreateInstance() se charge de créer une instance DbContext qui est disposée à chaque 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 public class ProfileProvider { /// <summary> /// Récupérer la liste des profiles. /// </summary> /// <returns>La liste des profiles utilisateurs.</param> public ObservableCollection<EntityProfile> GetProfiles() { ObservableCollection<EntityProfile> lstEntityProfile = null; using(DatabaseManagerContext context = DatabaseManagerContext.CreateInstance()) { lstEntityProfile = context.Profiles.ToObservableCollection(); } return lstEntityProfile; } }
Ici, cette fonction retourne tout la liste des profiles disponibles. Je l'ajoute dans un grid via WPF et la liste des profiles s'affiche dans ma grid.
Une fois édité dans l'IHM, on peut modifier le nom, le commentaire du profile. Puis sauver en base et c'est là que j'ai un problème :
Je met à jour la base via ce code :
Sauf qu'entre le code de mise à jour de la base et mon IHM il y un monde.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 /// <summary> /// Mise à jour d'un profile. /// </summary> /// <param name="_objProfile">Objet profile à mettre à jour</param> /// </summary> public void UpdateProfile(EntityProfile _objProfile) { using(DatabaseManagerContext context = DatabaseManagerContext.CreateInstance()) { context.Entry(_objProfile).State = EntityState.Modified; context.SaveChanges(); } }
Normalement context.SaveChanges(); devrait envoyer une notification de la liste ObservableCollection afin que l'IHM reflète toutes les modifications de la base.
Et là je ne sais pas faire ce lien. Déjà, le contexte est recréé systématiquement car using créé un dispose qui libère l'instance, l'instance qui lit et celle qui écrit n'est donc pas la même (dur dans ce cas de notifier l'Observable collection) !
Bien sur je pourrais dans l'IHM recharger la liste des profiles et remettre à jour l'IHM mais ce que je souhaite c'est d'avoir un mécanisme plus générique car modifier un profile peut se relèter dans une autre vue, différente de celle qui a modifié le profile.
Je ne sais pas si c'est clair, je voulais utiliser le CRUD de la base ou quelque chose comme ça mais je ne sais pas comment faire.
Si vous avez une idée ou un tutoriel ça m'intéresse...
Merci d'avance.
Partager