IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Linq Discussion :

[Entity Framework] : problème d'ajout dans une Datagrid WPF


Sujet :

Linq

  1. #1
    Membre à l'essai
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 12
    Points
    12
    Par défaut [Entity Framework] : problème d'ajout dans une Datagrid WPF
    Bonjour,

    Je rencontre un problème lors de l'ajout d'une entité en base de données :
    je bind une Datagrid wpf avec une liste de civilités (M., Mme, etc...).

    Voici le code d'initialisation de la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    protected bdd datacontext; 
     
    public fen_parametre()
    {
       InitializeComponent();
       bdd = new BddEntities();
    }
     
    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
       dg_civilite.DataContext = bdd.Civilite.OrderBy(c => c.codeCivilite);
    }
    Et voici le code d'ajout d'une nouvelle civilité. J'utilise l'événement RowEditEnding de la datagrid qui a sa propriété canUserAddRows à true :
    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
    private void dg_civilite_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
            {
                if (e.EditAction == DataGridEditAction.Commit)
                {
                    try
                    {
                       Civilite civilite = (Civilite)e.Row.Item;     
                       if (civilite.EntityState == EntityState.Detached)
                            datacontext.AddToCivilite(civilite);
                       datacontext.SaveChanges();
                    }
     
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.InnerException.ToString());
                    }
                }
            }
    Lorsque j'ajoute un enregistrement, voici l'erreur rencontrée ;
    Un objet ayant la même clé existe déjà dans ObjectStateManager. L'objet existant est dans l'état Unchanged. Un objet ne peut être ajouté de nouveau à ObjectStateManager que s'il est dans l'état ajouté.
    Ce qui est bizarre, c'est que l'enregistrement est bien inséré en base de données car lorsque je relance l'application, je retrouve ce nouvel enregistrement dans la datagrid.

    Autre question : Le fait d'avoir la propriété de la datagrid canUserAddRows a true me génère une erreur dans les sorties d'exécution :
    System.Windows.Data Error: 39 : BindingExpression path error: 'codeCivilite' property not found on 'object' ''Object' (HashCode=58324355)'. BindingExpression Path=codeCivilite; DataItem='Object' (HashCode=58324355); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
    System.Windows.Data Error: 39 : BindingExpression path error: 'libelleCivilite' property not found on 'object' ''Object' (HashCode=58324355)'. BindingExpression Path=libelleCivilite; DataItem='Object' (HashCode=58324355); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
    Je suppose que cela est lié à la ligne vide réservée à l'ajout d'un nouvel enregistrement. Existe-il un moyen d'éviter ce message ? Ce message expliquerait-il le problème que je rencontre lors de l'ajout ?

    Merci pour vos réponses

  2. #2
    Membre à l'essai
    Inscrit en
    Septembre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    Quand tu fait ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Civilite civilite = (Civilite)e.Row.Item;
    ton civilité n'est pas attaché au context tu rentre donc bien toujours dans le if dessous hors une ligne identique existe deja dans ton datacontext d'ou l'erreur renvoyé

    A mon sens tu as juste a appeller datacontext.SaveChanges() vus que les modifications que tu fait dans ta grid sont tracker dans le context.

  3. #3
    Membre à l'essai
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse, mais cela ne fonctionne pas.
    Le datacontext ne contient pas le nouvel enregistrement.
    Rien n'est donc sauvegardé en bdd.

    je précise qu'avec le AddToCivilite(), en mode débogage, l'erreur ne remonte qu'après la fin de l'exécution de l'événement RowEditEding après ce message d'avertissement :
    Il n'y a pas de code source disponible pour l'emplacement en cours.
    OK / Afficher le code machine
    Cette séquence passe donc sans erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Civilite civilite = (Civilite)e.Row.Item;     
    if (civilite.EntityState == EntityState.Detached)
       datacontext.AddToCivilite(civilite);
    datacontext.SaveChanges();
    J'ai l'impression qu'après le rowEditEding(), une nouvelle insertion est effectuée dans le datacontext (mai je ne sais pas quand et par quoi).
    Je n'utilise peut-être pas le bon événement ?

Discussions similaires

  1. [Débutant] problème d'ajout dans une listBox
    Par theangel2011 dans le forum C#
    Réponses: 5
    Dernier message: 17/08/2011, 16h35
  2. Problème d'ajout dans une liste
    Par topgun1223 dans le forum C
    Réponses: 4
    Dernier message: 23/03/2010, 18h06
  3. Ajout de ligne dans une datagrid ou gridview
    Par thierry007 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 16/11/2007, 09h23
  4. [C#] Problème d'ajout d'une ligne dans une DataTable
    Par therock dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/11/2006, 08h27
  5. [vbnet] problème de conversion dans une datagrid
    Par Jsh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/09/2005, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo