Können Sie einen DataContext davon überzeugen, eine Spalte als immer schmutzig zu behandeln?

8

Gibt es eine Möglichkeit, LINQ-to-SQL zu erzwingen, eine Spalte als schmutzig zu behandeln? Global würde ausreichen ....

Grundsätzlich habe ich ein Problem mit einigen Audit-Code auf einem Legacy-System, mit dem ich mit L2S sprechen, vorstellen:

%Vor%

Das ist in Ordnung, aber wenn derselbe Benutzer es zweimal hintereinander aktualisiert, ist der UpdatedBy ein NOP und der TSQL wird (grob):

%Vor%

In meinem Fall besteht das Problem darin, dass es derzeit einen Gürtel-und-Klammer-Prüfauslöser für alle Tabellen gibt, der prüft, ob die Prüfspalte aktualisiert wurde, und wenn nicht angenommen wird, dass der Entwickler fehlerhaft ist (statt SUSER_SNAME() , obwohl es genauso leicht einen Fehler werfen könnte).

Was ich wirklich gerne tun könnte, ist zu sagen: "Aktualisiere diese Spalte immer, auch wenn sie nicht schmutzig ist" - ist das möglich?

    
Marc Gravell 13.10.2009, 14:13
quelle

5 Antworten

8

Basierend auf KristoferA's Antwort , ich landete mit etwas wie unten; das ist böse und brüchig (oft wird es reflektiert), aber vielleicht muss es für jetzt genügen. Die andere Seite des Kampfes ist es, die Auslöser zu ändern:

%Vor%     
Marc Gravell 14.10.2009, 08:17
quelle
1

Ich glaube leider, dass Sie einen neuen DataContext verwenden müssen

    
Josh Stodola 13.10.2009 14:30
quelle
1

Details unter: Ссылка

Sie können das Standardaktualisierungsverhalten überschreiben. Es gibt 2 Möglichkeiten, dies zu tun

Am einfachsten ist es, eine gespeicherte Prozedur zu erstellen (falls dies in Ihrer Datenbank nicht möglich ist, sollte die zweite Methode funktionieren), die die Parameter Ihres Kundenobjekts übernimmt und die Tabelle aktualisiert:

  1. Erstellen Sie die gespeicherte Prozedur mit einem Parameter für jede Eigenschaft von Kunden, die aktualisiert werden muss.
  2. Importieren Sie diese gespeicherte Prozedur in Ihre Linq To SQL-DBML-Datei.
  3. Jetzt können Sie mit der rechten Maustaste auf Ihre Kundeneinheit klicken und "Verhalten konfigurieren" auswählen.
  4. Wählen Sie Ihre Kunden-Klasse im Dropdown-Menü "Klasse" und "Aktualisieren" im Dropdown-Menü "Verhalten".
  5. Wählen Sie das Optionsfeld "Anpassen" und wählen Sie die gespeicherte Prozedur, die Sie gerade erstellt haben.
  6. Nun können Sie die Eigenschaften der Klasse der gespeicherten Prozedur zuordnen.

Wenn Linq to SQL nun versucht, Ihre Customers-Tabelle zu aktualisieren, verwendet es stattdessen Ihre gespeicherte Prozedur. Seien Sie vorsichtig, da dies das Updateverhalten für Kunden überall überschreiben wird.

Die zweite Methode besteht darin, partielle Methoden zu verwenden. Ich habe das nicht wirklich versucht, also könnte dir das hoffentlich nur eine allgemeine Richtung geben. Erstellen Sie in einer partiellen Klasse für Ihren Datenkontext eine partielle Methode für das Update (Es wird Update

Joel Beckham 13.10.2009 16:20
quelle
1

Wenn Sie die [schmutzige] Reflektionsroute hinuntergehen möchten, könnten Sie etwas nach folgendem Schema versuchen:

1) Überschreibe SubmitChanges
2) Gehe durch den Änderungssatz
3) Verwenden Sie Reflektion, um den Änderungstracker für jedes aktualisierte Objekt zu erhalten (siehe Was ist der sauberste Weg, um ein Linq-Objekt" schmutzig "zu machen? )
4) Machen Sie die Spalte schmutzig (es gibt ein DirtyMemberCache-Feld in der StandardTrackedObject-Klasse)

    
KristoferA 14.10.2009 00:56
quelle
0

Das Folgende funktioniert für mich. Beachten Sie jedoch, dass ich den Provider linq2sql von DevArt verwende, aber das spielt keine Rolle:

%Vor%

Dies erzeugt den folgenden sql:

%Vor%

Also wird messageBody aktualisiert, obwohl sein Wert nicht geändert wird. Eine weitere Änderung, die dafür notwendig ist, ist, dass ich für jede Eigenschaft (Spalte) meiner Entity Message UpdatedCheck = UpdateCheck.Never gesetzt habe, mit Ausnahme der ID, die der Primärschlüssel ist.

    
Razzie 14.10.2009 06:55
quelle

Tags und Links