Linq To SQL DataContext/Datenbindung

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von PublicProperty.

    Linq To SQL DataContext/Datenbindung

    Hallo Kollegen,

    ich experimentiere mit einer kleinen Linq to SQL Anwendung. Ich habe dazu eine SQL Server Compact Datenbank mit einigen Tabellen angelegt. Ich habe eine DataContext Klasse erzeugt und eine Klasse aus diesem Kontext als Datenquelle deklariert. Ich habe eine Listbox und ein paar andere Controls auf ein Formular gelegt. Wenn ich das Datenquellenobjekt auf das Formular ziehe, wird eine BindingSource und ein Navigator erzeugt.


    Wenn ich das Formular starte, wird der Inhalt der Tabelle "Categories" in der Listbox angezeigt. Über den Navigator kann ich ich Datensätze löschen, was auch sofort in der Listbox zu sehen ist. Nun möchte ich der Tabelle neue Einträge hinzufügen. Ich erzeuge also eine neue Instanz von Categories -> der Mapper Klasse für die Tabelle und füge diese Instanz in den DataContext ein, indem ich zuerst

    dataContext.Categories.InsertOnSubmit(myNewCatergory)

    und dann

    dataContext.SubmitAllChanges()

    aufrufe. Leider wird der neue Eintrag nicht in der Listbox angezeigt. Erst wenn ich das Programm abbreche und neu starte, ist der Eintrag zu sehen. Wenn ich nach dem Einfügen, die Instanzvariable mit dem DataContext neu intialisiere -> var = New DBDataContext, wird die Listbox mit dem neuen Eintrag versehen. Ich kann mir allerdings nicht vorstellen, dass dieses Vorgehen so sein soll.

    Wo ist mein Fehler?
    ich bin vmtl. iwie zu dumm, aber mir erscheinen die OR-Dinger wie Linq2Sql und EntityFramework in diesem Punkt wie ein Rückschritt inne Datenbänkerei.
    Weil in olle Dataset hat man dem Dataset einen neuen Datensatz zugefügt, und dann hatte man einen neuen Datensatz im Dataset, und der wurde auch sofort angezeigt im daran gebundenen Gui.

    Beil L2S scheint nun nurnoch vorgesehen, dass man Datensätze der Datenbank zufügt - wovon das Gui natürlich nichts hat, denn dass ist ja am (Dataset-Nachfolger) DataContext angebunden, und der kriegt natürlich nicht mit, wenn jmd daran vorbei was in die DB schreibt.

    Mit einem Trick habe ich die Dataset-Logik aber auf den L2S-Datacontext übertragen, sodass man nunmehr einen Datensatz in den Datacontext einfügt, und dann hat man einen neuen Datensatz im DataContext, und der wird auch sofort angezeigt im daran gebundenen Gui.

    Leider habe ich den Trick grad vergessen, und muß nochmal suchen, sorry. :(

    Edit: ah - hier - aus 4ViewsWpf - M_N_View:

    VB.NET-Quellcode

    1. Public Property AddKunde As New RelayCommand( _
    2. Sub()
    3. Dim kd = New Kunde With {.Name = "Rumpelstilzchen"}
    4. Dim lst = DirectCast(Context.Kundes, IListSource).GetList
    5. lst.Add(kd)
    6. End Sub)
    Also das Kunde-EntitySet wird auf IListSource gecastet, und davon die List abgerufen - der kann man den neuen Kunden adden.

    crazy - odr?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Vielen Dank für Deine Antwort.

    Ich entnehme Deiner Antwort, dass es scheinbar so ist, das ein DataContext nicht automatisch die Änderungen durchleitet. Meine Bastellösung erzeugt nach jedem Einfügen eine neue Instanz des DataContext und setzt die DataSource Eigenschaften aller BindingSources neu. Das führt dann auch zum Update aller Controls. Nur irgendwie ist das doch seltsam oder? Ich habe mit verschiedenen Refresh Varianten gespielt, aber immer ohne das gewünschte Ergebnis.

    PublicProperty schrieb:

    Ich entnehme Deiner Antwort, dass es scheinbar so ist, das ein DataContext nicht automatisch die Änderungen durchleitet.
    Ganz falsch!
    bla.InsertOnSubmit() inserted am DataContext vorbei direkt in die Datenbank - das ist das Problem.
    Also nicht, dass der DataContext nicht durchleiten würde, sondern er wird ja umgangen.

    Meine Bastellösung erzeugt nach jedem Einfügen eine neue Instanz des DataContext und setzt die DataSource Eigenschaften aller BindingSources neu. Das führt dann auch zum Update aller Controls.
    ... Nur irgendwie ist das doch seltsam oder?
    Ja, das ist die kranke Lösung, zu der scheinbar jedermann sich zu greifen genötigt sieht:
    Um einen neuen Datensatz zuzufügen, wird dieser nicht dem Datacontext zugefügt, sondern der Datenbank. Sieht man natürlich nicht im Gui, also lädt man den kompletten Datacontext neu
    -> Irrsinniger Schwachsinns-Traffic, und bringt einen Haufen Probleme, zB. in Listen-Controls gehen bei einem Re-Load natürlich die Selektionen verloren.

    Ich habe mit verschiedenen Refresh Varianten gespielt, aber immer ohne das gewünschte Ergebnis.
    haste auch meinen Vorschlag ausprobiert? Weil der fügt ja in den DataContext ein, und letzterer leitet ganz brav durch, wenn du .SubmitChanges aufrufst.