EF6 und Redo

  • C#

    EF6 und Redo

    Moin,

    ich habe eine WPF-Anwendung, in der eine Liste von Daten als DataGrid angezeigt wird. Die Einträge der Liste können nicht direkt editiert werden, dafür gibt es ein extra Formular.

    Mein Problem ist der vom User initiierte Abbruch des Editiervorganges. Folgenden Code verwendet ich im aufrufenden Formular, wenn der User auf Editieren klickt um das Editierformular zu öffnen und die Useraktion zu bearbeiten:

    C#-Quellcode

    1. static void Bearbeiten(LogsEViewModel view) {
    2. //var entity = view.view.dataGrid.SelectedItem as LogsEEntity;
    3. var entity = (view.SelectedItem as LogsEEntity);
    4. if (entity != null) {
    5. var dialog = new LogE2NeuDialog(entity);
    6. if ((bool)dialog.ShowDialog()) {
    7. view.db.SaveChanges();
    8. }
    9. else {
    10. if (view.db.Entry(entity).State != System.Data.Entity.EntityState.Unchanged) {
    11. var s1 = (view.db.Entry(entity).State.ToString());
    12. if (view.db.Entry(entity).State == System.Data.Entity.EntityState.Detached)
    13. view.db.Entry(entity).State = System.Data.Entity.EntityState.Modified;
    14. var originals = view.db.Entry(entity).OriginalValues;
    15. view.db.Entry(entity).CurrentValues.SetValues(originals);
    16. view.db.Entry(entity).State = System.Data.Entity.EntityState.Unchanged;
    17. view.NotifyPropertyChanged("Logs");
    18. var s2 = (view.db.Entry(entity).State.ToString());
    19. Debug.Print($"vorher: {s1} nachher: {s2}");
    20. }
    21. }
    22. }
    23. }


    Das klappt auch, komischerweise aber nur einmal!

    Wähle ich nach dem Abbruch denselben Datensatz ein zweites mal, ändere ihn und klicke wieder auf Abbruch, dann wird einen Ausnahme geschmissen mit dem Hinweis, dass die Entität nicht im Context vorhanden wäre!! Hä???

    Ich habe daraufhin einige Analysezeilen eingefügt (siehe obigen Code) und erhalte folgende Erkenntnisse:

    Beim ersten Durchlauf kommt entity als "Modified" an und verlässt die Methode als "Unchanged". Beim zweiten Durchlauf kommt die entity als "Detached" an, wobei der besagte Datensatz im DataGrid nach wie vor angezeigt wird.

    Den Fall "Detached" fange ich ab und versuche, den Status wieder auf "Modified" zurückzusetzen und das geht schief:

    "Attaching an entity of type 'Models.LogsEEntity' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate."


    Aber warum wird die Entität überhaupt aus dem Context geschmissen? Das verstehe ich nicht. Hat jemand Hinweise, was da falsch läuft?

    Gruß

    MQ

    --EDIT:--

    es ist wohl so, dass nicht nur das ausgewählte Element sondern alle Elemente aus dem Context auf "Detached" stehen nachdem einmal der "Abbruch"-Zweig (Zeilen 12 bis 26) durchlaufen wurde. Da die Elemente am Ende der Methode (Zeile 26) noch alle da sind, sieht sich irgendwas danach veranlasst, alle Elemente aus dem Context abzuklemmen. Darauf habe ich keinen Einfluss, denn die Kontrolle liegt ja dann wieder bei UI.

    --Edit:--

    Mittlerweile ist klar, was das Problem ist. Es ist die Zeile mit NofifyPropertyChanged. Dieses wird mit "Logs" aufgerufen und das ist eine ObservableCollection, die an ItemSource des DataGrid gebunden ist. Alle Einträge sind nach "Detached".

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MasterQ“ ()