Entwickler-Ecke

WPF / Silverlight - Abhängig Tabellen


didi_12 - So 29.07.12 11:03
Titel: Abhängig Tabellen
Hallo,

da ich neu im Thema WPF und Datenanbindung bin, die folgende Frage.

Ich habe zwei Tabellen in SQL-Server, die in einer 1:n-Beziehung zusammenhängen. Nun will ich über entsprechende Controls beide Tabellen füllen. Ich habe entsprechende TableAdapter und kann auch beide Tabellen separat befüllen.

Ich will aber natürlich die ID der Child-Tabelle in den Record der Parent-Tabelle als Teil eines Inserts auf der Parent-Tabelle mitübernehmen. Sprich einen Record in der Child-Tabelle einfügen, die erzeugte ID dann dem Insert für die Parent-Tabelle mitübergeben. Wie gehe ich da vor ?

Danke
Dieter


didi_12 - Sa 11.08.12 17:45

Hallo,

hat hier jemand eine Idee. Wie gesagt, wie kriege ich 1:n-abhängige Records über WPF-Controls in die entsprechenden Tabellen der Datenbank, so dass die Einträge in den WPF-Controls dann über einen Save-Button in korrekter Reihenfolge in die Tabellen der Datenbank gehen.

Danke
Dieter

Moderiert von user profile iconTh69: Full Quote entfernt


Th69 - Sa 11.08.12 18:32

Hallo Dieter,

der übliche Weg ist eigentlich die Verwendung eines ORM (Object Relation Mapper), z.B. EF (Entity Framework) oder Linq-2-SQL - zumindestens diese sind beide beim Visual Studio dabei (es gibt noch einige mehr...). Dann brauchst du dich gar nicht mehr Gedanken um die Ids machen, sondern dies erledigt dann der ORM automatisch (sobald Foreign-Keys in der DB angelegt sind).

P.S: Hast du dich bei deinem ersten Beitrag nicht zwischen Child und Parent vertan, denn üblicherweise hat eine Child-Tabelle ja eine Parent-Id (nicht umgekehrt)?


didi_12 - So 12.08.12 13:29

Hallo,

vielen Dank für die Antwort. Ich werde das ganze also mit dem EF realisieren müssen ? Sprich nochmal von vorne ?

Das macht sicher Sinn. Wozu dient dann der Database Designer, in dem ich die entsprechenden Objekte zu den Tabellen selbst herstelle und auch verknüpfe, der dann entsprechende TableAdapter-Objekte generiert. Damit kann ich dann wohl auf die einzelnen Tabellen in der DB lesend und schreibend zugreifen, aber nicht wirklich Relationen im schreibenden Zugriff abbilden ?

Danke
Dieter


Th69 - So 12.08.12 14:09

Hallo Dieter,

ich habe noch mal ein bißchen recherchiert (da ich selber die typisierten DataSets bzw. TableAdapters nur erst einmal eingesetzt hatte).
Es scheint dafür die generierte TableAdapterManager [http://msdn.microsoft.com/de-de/library/bb384426.aspx]-Klasse zu geben (sobald "Hierarchical Update" auf true gesetzt ist - ab VS 2010 wohl standardmäßig so), welche genau für das Updaten von Foreign-Key Beziehungen gedacht ist - vllt. hilft dir das ja schon...


didi_12 - So 26.08.12 21:30

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Dieter,

ich habe noch mal ein bißchen recherchiert (da ich selber die typisierten DataSets bzw. TableAdapters nur erst einmal eingesetzt hatte).
Es scheint dafür die generierte TableAdapterManager [http://msdn.microsoft.com/de-de/library/bb384426.aspx]-Klasse zu geben (sobald "Hierarchical Update" auf true gesetzt ist - ab VS 2010 wohl standardmäßig so), welche genau für das Updaten von Foreign-Key Beziehungen gedacht ist - vllt. hilft dir das ja schon...


Hallo,

vielen Dank. Sicher der richtige Ansatz, soweit ich das gelesen und verstanden habe. Ich habe das nun probiert und renne in einen Fehler, ich weiss aber nicht, wie ich den gefixed kriege


C#-Quelltext
1:
MessageBox.Show(Convert.ToString(oPostkriegDataSet_TableAdapterManager.UpdateAll(this.oPostkriegDataSet)));                    


Diese Zeile führt zu diesem Laufzeit-Fehler:

Object reference not set to an instance of Object.Systems.Collections.ListDictionaryPostkrieg2

Wenn ich Debugge sehe ich, dass das Datenset definiert ist, allerdings beim Hovern mit der Maus über das TableAdapterManager-Objekt kriege ich "No overload for method UpdateAll takes 0 arguments". Das Datenset ist aber definiert und war für das Kompilieren auch das richtige Objekt (offensichtlich).

Weiss jemand, wo ich da ansetzen muss ?

Danke
Dieter


didi_12 - So 26.08.12 21:57

Es scheint, dass der TableAdapterManager selbst nicht instantiiert ist. Wie muss ich vorgehen um hier eine gültige Objektinstanz zu erzeugen ?


C#-Quelltext
1:
oPostkriegDataSet_TableAdapterManager = new Postkrieg2.DataSet_Postkrieg2_Direct_To_SQLDatabaseTableAdapters.TableAdapterManager();                    


Das scheint es jedenfalls nicht zu tun bzw. nicht auszureichen ?

Danke
Dieter


didi_12 - So 09.09.12 19:26

Hallo,

hat irgendjemand eine Idee, würde mir sehr helfen !

Danke
Dieter