Nach der Frage diese Frage , wo ich darüber informiert wurde, wie die Table<T>.Attach()
Methode funktioniert, habe ich eine andere Frage.
Wie trennen Sie ein LINQ-to-SQL-Datenobjekt vom Zustandsüberwachungsmechanismus DataContext
? Grundsätzlich möchte ich einen Datensatz ziehen und die Daten auf dem Datensatz ändern. Aber wenn ich SubmitChanges()
für dieselbe Instanz DataContext
aufruft, möchte ich nicht, dass der Datensatz aktualisiert wird, es sei denn, ich habe Attach()
explizit aufgerufen. Wie wird das erreicht?
Von dieser Seite erklären, wie man ein linq-Objekt löst fügen Sie diese Methode dem Objekt hinzu, das Sie trennen möchten:
%Vor%Ich empfehle dringend, dass Sie, wenn Sie LINQ to SQL verwenden, Ihr Design so ändern sollten, dass das Verhalten von LINQ to SQL beim Senden von Änderungen an allen angefügten modifizierten Entitäten berücksichtigt wird. Meiner Erfahrung nach wird der Versuch, dieses Feature zu umgehen, nur zu Schmerzen führen.
Leider können Sie Entitäten aus dem vorherigen DataContext nicht explizit trennen, ohne die Entitäten zu serialisieren und zu deserialisieren.
Was Sie für Ihren Zweck tun können, ist eine Kopie des Objekts, das Sie aus der DB gezogen haben, zu erstellen und mit der Kopie zu arbeiten. In diesem Fall ist Ihr ursprüngliches Objekt unberührt. Wenn es an der Zeit ist, die DB zu aktualisieren, können Sie die Kopie einfach an Ihren DataContext anhängen.
Ich habe Objekte geklont, die mit Serialize / Deserialize aus einem DataContext abgefragt wurden, und das neue Objekt ohne Probleme an denselben DataContext übergeben. Wenn Entitäten angehängt sind, müssen diese vor dem Senden des Klons mithilfe der IDs erneut abgefragt werden.
%Vor%Die einfachste Lösung in vielen Fällen ist das Serialisieren / Deserialisieren des Objekts, um es einfach zu klonen. Welche Serialisierungs- / Clone-Methode Sie verwenden, liegt ganz bei Ihnen. Diese Frage enthält eine Reihe von Vorschlägen in dieser Hinsicht.
Ich verwende Newtonsoft JSON.NET gerne für die Serialisierung, weil es super einfach zu benutzen ist, minimale Anforderungen hat (z. B. keine Compiler-Attribute erforderlich) und ich es bereits für andere Dinge in meinen Projekten verwende. Abhängig von Ihrem Anwendungsfall (z. B. Trennen einer LINQ / SQL-Entität, die in einem UI-Modell verwendet werden soll) möchten Sie möglicherweise die Datenbank-IDs löschen. Eine einfache Möglichkeit besteht darin, eine benutzerdefinierte DefaultContractResolver-Klasse an JSON.NET zu übergeben, die die ID-Eigenschaften ausschließt:
%Vor%Tags und Links c# linq linq-to-sql datacontext