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