2009-04-03 4 views
2

Mit Linq To Sql - was ist der beste Weg, um den Wert einer Tabelle in einer Datenbank zu aktualisieren, wenn sich ein Wert in einer anderen Tabelle ändert?Linq To Sql - Aktualisiert einen Wert, wenn sich ein anderer Wert ändert

Zum Beispiel in Tabelle A gibt es eine Spalte namens DateModified. TableA hat eine Assoziation zu TableB. Jetzt möchte ich den Wert des DateModified-Felds jedes Mal auf das aktuelle Datum setzen, wenn sich der Datensatz in TabelleA UND ändert, wenn ein untergeordneter Datensatz in TableB erstellt/aktualisiert/gelöscht wird.

Wie kann dies erreicht werden?

Antwort

4

Wenn die Änderung nur in der Aufzeichnung war, können Sie entweder die On*Changed Teil Methoden verwenden, oder können Sie SubmitChanges auf dem Daten Kontext außer Kraft setzen, rufen GetChangeSet, und wenden Sie die Änderungen, kurz bevor sie aktualisiert werden. Der letztere (Datenkontext) -Ansatz ist nützlich, um ein breites Spektrum von Änderungen zu erfassen, wobei der On*Changed-Ansatz für eine Logik nützlich ist, die für einzelne Eigenschaften spezifisch ist.

Im vorliegenden Fall (nicht homogene Aktualisierungen) erwarte ich jedoch, dass ein Datenbanktrigger geeigneter ist.

+0

Wenn es bei jeder Änderung aktualisiert wird, würde ich die Methode On * Changed nicht für jede Eigenschaft implementieren, sondern einen PropertyChanged-Handler registrieren, da jeder Setter SendPropertyChanged für diese Spalte auslöst, wenn er erfolgreich ist. – tvanfosson

+0

BTW - Ich stimme zu, dass der Auslöser eine bessere Möglichkeit ist, damit umzugehen. – tvanfosson

0

Entweder tun Insert/Update/Löschen auf TableB über eine StoredProcedure, die Sie das Update auf TableA ausführen können oder haben Insert/Update/Delete-Trigger auf TableB, die aktualisiert TableA

Ich würde nicht versuchen, dies zu tun in LINQ, da es entweder das Überschreiben verschiedener IDE-generierter Codestrukturen (Wartungs-Albtraum) oder zusätzliche Aufrufe an die Datenbank beinhaltet, um das zugehörige TableA-Element zu erhalten.

2

Sie könnten eine PropertyChanged-Ereignisbehandlungsroutine für die untergeordnete Entität in OnCreated (implementiert in einer partiellen Klasse) registrieren, damit diese Prozedur die übergeordnete Eigenschaft aktualisiert. Wenn Sie nicht möchten, dass die bereits geladenen Klassen die Änderung erhalten, wäre auch die Verwendung eines DB-Triggers, wie @Marc vorschlägt, eine Option.

BEARBEITEN: Wenn Sie auch Löschvorgänge abfangen müssen, können Sie die partielle Löschmethode für den Datenkontext implementieren, um dieselbe Handlermethode zum Aktualisieren des übergeordneten Elements der zu löschenden Entität aufzurufen.

Verwandte Themen