Hallo,
ich möchte an meine Frage von vor einer Woche anknüpfen. Irgendwie finde ich keine verständliche Beschreibung wie man Daten, ausgehend von einer Tabelle in einer Datenbank, mit Hilfe von EF6 und DataBinding in ein Formular und auch zurück bekommt. (Fast) Alles was so beschrieben ist, hilft mir nicht in der Praxis.
Punkt 1)
Nimmt man die Dokumentation für EF6, DataBindung, WPF oder auch WinForms, dann bekommt man Daten aus einer DB in einer Struktur DataGrid(View) angezeigt. Das ist kein Hexenwerk, in einer echten Anwendung allerdings meist nur die halbe Miete.
Punkt 2)
Hat man die Daten in einem DataGrid(View) kann man auch durch das Eingeben neuer Zeilen in der Tabelle, diese ohne große Umstände in die DB schreiben.
Punkt3)
Will man allerdings Datensätze löschen, dann machts aua!
Punkt 4)
Gleiches wie unter 3) gilt wenn vorhandene Datensätze inhaltlich geändert werden.
Unter EF6 bietet der ChangeTracker des Contextes die Möglichkeit, verschiedene Aktionen an Datensätzen zu verfolgen und gibt dazu Angaben zum Status einer Entität. Diese wären "Added", "Modified", "Detached", "Deleted" und "Unchanged". Hilft einem das? Irgendwie nicht! Oder doch?
Die Daten aus der DB werden typischerweise über DataBinding an ein Steuerelement gebunden. Das geht entweder über z.B. List, BindingList oder ObservableCollection. Egal wie, ich muss Events abfangen, die die Änderungen in der Tabelle behandeln und in den Datenkontext übernehmen.
DBContext bietet mit der .Entry()-Methode Zugriff ein DbEntityEntry-Objekt und dieses auf den Status der angegebenen Entität. So zumindest beschreibt es die Dokumentation.
Damit sollte man meinen, dass man mit einem
den Status von entität auf "Gelöscht" setzen kann, damit bei dem nächsten Sync über das korrekte SQL-Statement abgeschickt werden kann. Aus dem Context sollte entität nicht gelöscht werden, denn dann würde das Pendant in der DB nicht angefasst werden und bliebe unverändert. Der Befehl löscht entität aber aus dem (lokalen) Context. Das ist doch Blödsinn, oder?
Also ich kriege es hin, die Events des DataGrid, der Listen oder Collections abzufangen um auf die Aktionen wie neue Datensätze anlegen oder alte löschen zu reagieren. Ab wie bringe ich dem Context bei, die Statusangaben entsprechen zu setzen? Oder geht das ganz anders?
Wo kann ich mal nachlesen, wie man die Aktionen Löschen und Modifizieren umsetzen kann?
Danke
MQ
ich möchte an meine Frage von vor einer Woche anknüpfen. Irgendwie finde ich keine verständliche Beschreibung wie man Daten, ausgehend von einer Tabelle in einer Datenbank, mit Hilfe von EF6 und DataBinding in ein Formular und auch zurück bekommt. (Fast) Alles was so beschrieben ist, hilft mir nicht in der Praxis.
Punkt 1)
Nimmt man die Dokumentation für EF6, DataBindung, WPF oder auch WinForms, dann bekommt man Daten aus einer DB in einer Struktur DataGrid(View) angezeigt. Das ist kein Hexenwerk, in einer echten Anwendung allerdings meist nur die halbe Miete.
Punkt 2)
Hat man die Daten in einem DataGrid(View) kann man auch durch das Eingeben neuer Zeilen in der Tabelle, diese ohne große Umstände in die DB schreiben.
Punkt3)
Will man allerdings Datensätze löschen, dann machts aua!
Punkt 4)
Gleiches wie unter 3) gilt wenn vorhandene Datensätze inhaltlich geändert werden.
Unter EF6 bietet der ChangeTracker des Contextes die Möglichkeit, verschiedene Aktionen an Datensätzen zu verfolgen und gibt dazu Angaben zum Status einer Entität. Diese wären "Added", "Modified", "Detached", "Deleted" und "Unchanged". Hilft einem das? Irgendwie nicht! Oder doch?
Die Daten aus der DB werden typischerweise über DataBinding an ein Steuerelement gebunden. Das geht entweder über z.B. List, BindingList oder ObservableCollection. Egal wie, ich muss Events abfangen, die die Änderungen in der Tabelle behandeln und in den Datenkontext übernehmen.
DBContext bietet mit der .Entry()-Methode Zugriff ein DbEntityEntry-Objekt und dieses auf den Status der angegebenen Entität. So zumindest beschreibt es die Dokumentation.
Ruft den Zustand der Entität ab oder legt diesen fest.
public System.Data.Entity.EntityState State { get; set; }
Damit sollte man meinen, dass man mit einem
den Status von entität auf "Gelöscht" setzen kann, damit bei dem nächsten Sync über das korrekte SQL-Statement abgeschickt werden kann. Aus dem Context sollte entität nicht gelöscht werden, denn dann würde das Pendant in der DB nicht angefasst werden und bliebe unverändert. Der Befehl löscht entität aber aus dem (lokalen) Context. Das ist doch Blödsinn, oder?
Also ich kriege es hin, die Events des DataGrid, der Listen oder Collections abzufangen um auf die Aktionen wie neue Datensätze anlegen oder alte löschen zu reagieren. Ab wie bringe ich dem Context bei, die Statusangaben entsprechen zu setzen? Oder geht das ganz anders?
Wo kann ich mal nachlesen, wie man die Aktionen Löschen und Modifizieren umsetzen kann?
Danke
MQ