EF et WPF : Réponse à Thomas
Comme ce que je vais dire est quelque chose de fondamental si vous voulez utiliser l'EF, j'ai décidé de faire un nouveau post pour répondre à Thomas.
Pourquoi il n'est pas possible d'utiliser directement
odp.ObjectInstance = new ObservableCollection<Category>(Context.Instance.Categories);
Que ce passe-t-il quand on fait Context.Instance.Categories ?
Une requête est générée en base pour connaître les catégories. Ensuite (sauf dans le cas d'un MergeOption.NoTracking), l'EF va comparer les EntityKeys des catégories déjà présentes dans l'ObjectContext avec le résultat de la requête pour ne pas avoir à réinstancier les catégories déjà présentes. Cependant, ce qui est très important, c'est que les entités renvoyées devront toutes correspondre à un row dans la BD. C'est à dire que si vous ajoutez une nouvelle catégorie, elle ne sera jamais retournée tant que vous n'aurez pas persisté votre contexte en base avec la méthode SaveChanges. A l'inverse, si vous supprimez une catégorie, elle continuera d'être retournée tant que vous n'aurez pas persisté le contexte.
Ce scénario n'est pas idéal dans notre cas.
De plus, la solution tentée par Thomas pose également un autre problème. Comment l'ajout d'une catégorie va-t-elle faire rafraîchir l'UI (en l'occurrence la combo) ?
En effet, il y a deux possibilités : soit quand on ajoute une catégorie, on l'ajoute à l'ObservableCollection mais alors elle ne sera pas présente dans le contexte et implique donc du code pour la sauvegarder en base, soit on l'ajoute normalement au contexte mais dans ce cas, il va falloir manuellement déclencher l'évènement CollectionChanged après le SaveChanges.
Bref, vous l'aurez compris, le passage par ObservableCollection n'est, à mon avis, pas idéal dans notre cas.
Maintenant j'aimerais revenir sur ma solution. L'avantage de passer par l'ObjectStateManager va vous permettre de
- Ne pas avoir à exécuter une nouvelle requête en base dès que vous voulez ajouter / supprimer une catégorie
- Pouvoir récupérer les catégories sans avoir besoin pour cela de les persister en base.
- Ne pas avoir à partager l'ObservableCollection entre les différentes fenêtres de l'application car pour ajouter une catégorie, il suffira de faire
NorthwindEntities.Instance.AddToCategories(new Category { bla bla bla });
avec bla bla bla les propriétés de Category que vous souhaitez initialiser.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :