Bpnjour,
Je débute avec le triptyque WPF/MVVM/EF pour la couche d'accès aux données.
Voici mon modèle (très simple) :
J'ai un UserControl qui possède tous les champs détails d'un objet 'Project'. Parmi ces champs, une ComboBox qui se peuple avec toutes les instances de l'entité 'Customer' (relation 0.*).
Tout se passe bien jusqu'à ce que j'essaie de changer le client pour un projet : J'ai d'abord (naïvement je pense) tenté de faire :
Code c# : 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 // Délégué exécuté grâce à une EventToCommand public class DetailedProjectViewModel : ViewModelBase { #region Variables readonly DataBaseModel_Container _context = new DataBaseModel_Container(); #endregion private void CustomerChanged(SelectionChangedEventArgs parameter) { var newCustomer = (Customer)parameter.AddedItems[0]; _selectedProject.Customer = newCustomer; _context.SaveChanges(); } } }
Plantage avec l'exception suivante :_selectedProject est la variable locale qui est exposée par la propriété SelectedProject, laquelle est mise à jour via le système de messaging du MVVM light Toolkit :InvalidOperationException :Impossible de définir la relation entre les deux objets, car ils sont attachés à des objets ObjectContext différents.
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 /// <summary> /// Initializes a new instance of the DetailedProjectViewModel class. /// </summary> public DetailedProjectViewModel() { // Message subscription Messenger.Default.Register<PropertyChangedMessage<Project>>( this, (action) => DispatcherHelper.CheckBeginInvokeOnUI(() => SelectedProject = action.NewValue) ); ... }
Donc ce que je comprends c'est que je ne peux pas faire des opérations d'assignations aussi simplement parce que mon contexte Entity Framework (déclaré en variable locale à la classe dans chacun de mes ViewModel, un pour la ViewModel Maitre, l'autre pour la ViewModel Details) est différent dans mes 2 UserControl maitre et détail...
J'ai 2 questions :
1) Y a-t-il un moyen "propre"d'avoir un contexte Entity Framework commun à tous les ViewModel? Le mettre en propriété de la classe ViewModelBase dont hérite tous les ViewsModel est une bonne idée ou pas? Est-ce que ça va régler mon problème?
2) J'ai vu que pour une mise à jour de ma base via Entity Framework (typiquement changement de Customer pour un projet donné), pour les propriétés de navigation, je semble devoir xréer une nouvelle EntityKey : je n'ai pas trouvé la façon de le faire, avez-vous des exemples que je pourrais appliquer à mon cas?
Merci beaucoup d'avance du temps que vous prendrez à me répondre.
Cordialement,
Nixar
Partager