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):
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?
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%Ich glaube leider, dass Sie einen neuen DataContext verwenden müssen
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:
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
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)
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.
Tags und Links .net c# linq-to-sql