Announcement

Collapse
No announcement yet.

Wie funktioniert DataTable.GetChanges() intern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie funktioniert DataTable.GetChanges() intern

    Hi ich bin dabei meine eigene ObservableCollection zu bauen die die Funktionalität wie DataTable.GetChanges() anbieten soll nur scheint mir noch das wissen zu fehlen wie ich die Änderungen erstmal richtig speichere um sie dann später auslesen zu können

    erste idee war ein Dictionary welches einfach alle Änderungen der Reihenfolge nach speichert um sogar ein Rollback ausführen zu können (lief auch soweit bis auf Modifizierungen rückgängig zu machen (is aber auch erstmal egal)) naja das prob hier is halt das man mit einfachen abfragen z.B
    Code:
    DicOfChanges.Where(x => (x.Value).Modification == CollStat.Added);
    auch elemete bekommt die später wieder gelöscht wurden.

    zweite Idee war für jede art von Änderung eine eigene Collection zu machen und dann während des Events zu die Änderung der einen Collection hinzu zu fügen und aus den anderen zu löschen hier find ich kann das dauerhafte iterieren zum Problem werden

    dritte Idee ich kombiniere 1. und 2. und erstelle ein
    Code:
    Dictionary<???,List/Dictionary<???>>
    um bei einen Event die Änderungen Objekt genauer bearbeiten zu können

    ich hab mir hier schon versucht die Logik dahinter zu verstehen bin aber leider kläglich gescheitert. Könnte mir bitte einer erklären wie das da ganz grob abläuft.

    spontane Ideen sind auch gerne gesehen

    momentan hab ich

    Code:
           #region nested class
            private class _ElementKeeper<T>
            {
                public T Element;
                public CollStat Modification;
    
                public _ElementKeeper(T element, CollStat Modifi)
                {
                    Element = element;
                    Modification = Modifi;
                }
            }
            #endregion
    beinhaltet das Element und die art der Modifikation

    Code:
    private Dictionary<int, _ElementKeeper<T>> DicOfChanges = new Dictionary<int, _ElementKeeper<T>>();
    ist das Dictionary welches ich mit Linq durchsuche

  • #2
    Ein DataTable funktioniert nur so wie sie funktioniert weil da nicht beliebige Objekte drin liegen sondern DataRows die ein Teil der Logik (und insbesondere das verwalten von altem um neuen Wert) übernehmen. Wenn du weiterhin deine ObservableCollection generisch halten willst und die mit beliebigen Objekten umgehen möchtest wird dir das Verfahren der DataTable kaum weiterhelfen.

    Ein simple Lösung wäre einfach nicht die Änderungen nachzuhalten sondern einfach beim Hinzufügen zur Collection eine Kopie des Objekts zu erstellen und intern zu verwahren im Falle eine Rollbacks dann einfach zurückkopieren bzw. einfach die Referenz von Kopie auf Original ändern. Wie genau hängt aber davon ab wie du mit der Collection umgehen willst, welche Feature du genau brauchst und in wie weit du den Objekten die du in der Liste verwalten willst ~Vorschriften~ machen kannst. Ein 1:1 Kopie des DataTable Verhaltens in einer generischen Liste ist ein erheblicher Aufwand der vermutlich kaum lohnt.

    ich hab mir hier schon versucht die Logik dahinter zu verstehen bin aber leider kläglich gescheitert.
    Es wäre einfacher wenn du dir den Framework Sourcecode über einen der üblichen Decompiler ansiehst (Reflectr, ILSpy, DotPeek etc.) dort hast du dann auch eine vernünftige Navigation um dich durch den Sourcecode zu bewegen. Hilft sehr beim verstehen wenn man sich auch durch den Sourcecode ~surfen~ kann.

    Comment


    • #3
      mhh na ich brauch das eigetnlich nur weil mein ViewModel 3 ObservableCollection<> beinhaltet und die über das UI bearbeitet werden und beim speichern wird das fertig bearbeitet ViewModel an mein Repository übergeben welches dann die Änderungen an die DB weitergeben soll Insert/Update/Delete. Das Rollback ist erstmal unwichtig.

      un dafür muss ich dann halt einfach wissen was alles gemacht wurde bis jetzt hab ich sowas immer gelöst das erstmal über die Id alle Referenzen in den N:N Tabellen gelöscht hab und dann die werte neu hinzugefügt hab was aber ja nicht das Ziel sein kann

      achso und ich kann den T Type durchaus beeinflussen da es eh Teil meines Frameworks werden soll kann ich ja zB ein Interface anbieten das die Klassen besitzen müssen wenn sie in meine Collection rein wollen

      Comment


      • #4
        Das sollte sich dann immer noch durch erstellen einer Kopie beim hinzufügen zur Collection lösen lassen.
        Du müßtest nur je Object den State nachhalten (Unchanged, Added, Edited, Deleted) und dann wenn der State Edited ist aus dem Originalobjekt und dem, zu irgendeinem Zeitpunkt tatsächlich in deiner Liste liegen Objekt ein Diff erzeugen. Also die relevanten Properties an beiden Objekten miteinander vergleichen und rausfinden ob die geändert wurden oder nicht.

        Edit: Dann müßten dein in der Collection verwalteten Objekte nur ICloneable richtig implementieren um eine Kopie zu bekommen und ein Interface um den State zu ändern und verwalten zu können. Edited würdest du ja in jeder Property deines Objekts setzen (wenn es nicht gerade auf Added oder Deleted steht) aber für die anderen State ändernden Aktionen bräuchtest du ein paar Methoden.

        Comment


        • #5
          ich hab anscheinend ein fertiges Beispiel gefunden http://dataobjectmodel.codeplex.com/ das kann alles was ich brauch da muss ich mir das ja doch nicht selber bauen ^^.

          Wenn ich zeit hab werde ich mir sicher trotzdem was eigenes bauen da werde ich deine hinweise berücksichtigen

          Comment

          Working...
          X