none
Problème update object Entity Framework MVVM RRS feed

  • Question

  • Bonjour, 

    J'utilise le model MVVM ainsi que le Entity Framework.

    J'ai un formulaire de modification qui contient 3 champs text et 1 comboBox. Ma ComboBox est bindée sur ma base de données, voici comment se fait le binding : 

     

    <ComboBox Width="262" ItemsSource="{Binding CursusList, Mode=TwoWay}" SelectedItem="{Binding SelectedCursus, Mode=TwoWay}">
    
                            <ComboBox.ItemTemplate>
    
                                <DataTemplate>
    
                                    <StackPanel>
    
                                        <TextBlock Text="{Binding Name}"/>
    
                                    </StackPanel>
    
                                </DataTemplate>
    
                            </ComboBox.ItemTemplate>
    
                        </ComboBox>

    Dans mon code, à l'appelle du constructeur, j'initialise mes champs par rapport à mon élément de type StudyTime que je passe en paramètre. Voici comment est déclaré mon constructeur : 

     public ManageStudyTimeViewModel(StudyTime studyTimeRef)
          : base()
        {
          
          this.studyTimeToUpdate = studyTimeRef;
    
          // Remplissage de la comboBox
          this.CursusList = new ObservableCollection<Cursus>();
          ObjectQuery allCursusQuery = DB.Cursus.Include("StudyTime");
          foreach (Cursus cursus in allCursusQuery)
          {
            this.CursusList.Add(cursus);
          }
    
          // Initialise les champs
          this.SelectedCursus = this.studyTimeToUpdate.Cursus;
          Console.WriteLine("Cursus selected = " + this.SelectedCursus.Name);
    
        }

    Le problème est que le SelectedItem de ma comboBox n'est pas pris en compte lors du chargement de la page. Pourtant, j'arrive correctement à le récupérer car dans mon Console.WriteLine (ci-dessus) j'arrive à afficher le bon élément.

    Ensuite, j'ai un second problème lorsqu'il s'agit de sauvegarder les données en base (faire un update), une erreur de type ObjectContext survient. 

     

    Est-ce que quelqu'un aurait la solution à mon problème ?

    Merci par avance

     

    jeudi 3 juin 2010 19:15

Réponses

  • Bonjour,

    1/Oubliez l'événement "Load" (en fait je parlais de Loaded de Window, mais dans MVVM, faut éviter). Avez-vous essayé de faire un projet exemple qui reproduit votre problème ? Avez-vous essayé de voir au niveau du débogueur si la méthode set de la propriété SelectedCursus n'était pas appellée plusieurs fois ?

    2/L'ObjectContext de l'Entity Framework, permet de suivre l'état de vos entités que vous récupérez. La surveillance des états des entités, permet à l'Entity Framework d'appliquez à votre demande les mises à jour nécessaires dans la base de données. Vous devez donc essayer de garder le même ObjectContext lorsque vous récupérez / mettez à jour vos entités. Dans des cas, plus complexes, il est possible d'associer une entité dans un autre contexte de données...

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    samedi 5 juin 2010 20:38
    Modérateur

Toutes les réponses

  • Bonjour,

    1/La propriété SelectedCursus, déclenche-t-elle un événement PropertyChanged ?

    2/une erreur de type ObjectContext survient : Quelle est le problème exactement ? Message d'exception ? Ligne de code ?

    PS : Afin d'avoir plus de chance d'obtenir une réponse, pensez la prochaine fois à poser une question par demande !

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 3 juin 2010 19:56
    Modérateur
  • Oui la propriété SelectedCursus déclenche bien un événement PropertyChanged. Voici mon code : 

     public Cursus SelectedCursus
        {
          get
          {
            return this.selectedCursus;
          }
          set
          {
            if (this.selectedCursus != value)
            {
              this.selectedCursus = value;
              OnNotifyPropertyChanged("SelectedCursus");
            }
          }
        }

    Et j'ai également implementé le INotifedPropertyChanged.

    Une exception de première chance de type 'System.InvalidOperationException' s'est produite dans System.Data.Entity.dll
    Impossible de définir la relation entre les deux objets, car ils sont attachés à des objets ObjectContext différents.
    

    Désolée pour la double question mais je pensais que ça pouvait éventuellement être lié.

    Merci 

    jeudi 3 juin 2010 20:21
  • Bonjour,

    1/Essayez de placer le code suivant :

    this.SelectedCursus = this.studyTimeToUpdate.Cursus;
    

    Dans l'événement "Load".

    2/Cette erreur se produite car 2 entités reliées entre-elles sont dans deux contextes différents...

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    jeudi 3 juin 2010 20:28
    Modérateur
  • 1/ De quel événement Load est-ce que vous parlez ? Comment l'implémenter ?

    2/ Je ne comprends pas trop la notion de contextes, est-ce que vous pourriez m'expliquer un peu svp ? Existe-t-il un moyen de contourner cette erreur ?  

    Merci

    jeudi 3 juin 2010 20:41
  • Bonjour,

    1/Oubliez l'événement "Load" (en fait je parlais de Loaded de Window, mais dans MVVM, faut éviter). Avez-vous essayé de faire un projet exemple qui reproduit votre problème ? Avez-vous essayé de voir au niveau du débogueur si la méthode set de la propriété SelectedCursus n'était pas appellée plusieurs fois ?

    2/L'ObjectContext de l'Entity Framework, permet de suivre l'état de vos entités que vous récupérez. La surveillance des états des entités, permet à l'Entity Framework d'appliquez à votre demande les mises à jour nécessaires dans la base de données. Vous devez donc essayer de garder le même ObjectContext lorsque vous récupérez / mettez à jour vos entités. Dans des cas, plus complexes, il est possible d'associer une entité dans un autre contexte de données...

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    samedi 5 juin 2010 20:38
    Modérateur
  • Bonjour,

     

    Gigine, quel est l’état de votre problème après les conseils de M. Tourreau ? Avez-vous réussi d’implémenter une solution ?

     

    Cordialement,

    Alex

    __________________________________________________________________________________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

     

    Astuces pour Visual Studio 2010

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Workflow Foundation

     

     

    mardi 8 juin 2010 10:39