Gibt es eine Möglichkeit festzustellen, ob ein LINQ-Objekt noch nicht in die Datenbank eingefügt wurde (neu) oder seit der letzten Aktualisierung geändert wurde (dirty)? Ich plane, meine Benutzeroberfläche an LINQ-Objekte (mit WPF) zu binden und muss sich abhängig davon, ob sich das Objekt bereits in der Datenbank befindet, anders verhalten.
%Vor%Die einzige einfache Lösung, die ich mir vorstellen kann, ist, den Primärschlüssel neuer Datensätze auf einen negativen Wert zu setzen (meine PKs sind ein Identitätsfeld und werden daher auf eine positive Ganzzahl auf% co_de gesetzt %). Dies funktioniert nur zum Erkennen neuer Datensätze. Es erfordert auch Identitäts-PKs und erfordert die Kontrolle über den Code, der das neue Objekt erstellt.
Gibt es einen besseren Weg, dies zu tun? Es scheint so, als ob LINQ den Status dieser Objekte intern verfolgen muss, damit er wissen kann, was in INSERT
zu tun ist. Gibt es eine Möglichkeit, auf diesen "Objektstatus" zuzugreifen?
Erläuterung Anscheinend war meine anfängliche Frage verwirrend. Ich suche keine Möglichkeit, Datensätze einzufügen oder zu aktualisieren. Ich suche nach einem Weg, bei jedem LINQ-Objekt festzustellen, ob dieses Objekt nicht eingefügt wurde (neu) oder seit der letzten Aktualisierung geändert wurde (dirty).
ChangeSet-Änderungen = context.GetChangeSet ();
Wenn changes.Inserts.Contains (yourObject) dann neu ist, wird es eingefügt, wenn SubmitChanges
aufgerufen wirdWenn changes.Updates.Contains (yourObject) vorhanden ist, befindet es sich bereits in der Datenbank und wird bei SubmitChanges ()
aktualisiertIch erstelle eine partielle Klasse für jedes Objekt, das LINQ erstellt (Datenobjekte), und jedes Objekt IDataObject-Schnittstelle implementieren
%Vor%In jedem Datenobjekt implementiere ich die IsNew-Eigenschaft, um true zurückzugeben, wenn der PrimaryKey gesetzt wurde:
%Vor%In meinem DataContext trage ich dann das Objekt, das als IDataObject gespeichert werden soll, und wenn es neu ist, rufe ich InsertOnSubmit () vor dem Aufruf von SubmitChanges () auf.
Dies ist vielleicht nicht der einfachste Weg, aber es erlaubt alle Objekte generisch zu speichern.
Es dauert einige Minuten, bis jede Tabelle die Schnittstelle implementiert hat, aber es kann eine generische Save () -Methode aufgerufen werden.
Das DataContext-Objekt verfolgt Änderungen an den Daten intern, sodass es die SQL-Abfragen optimieren kann, die beim Aufruf von SubmitChanges () generiert werden.
Wenn Sie neue Objekte in die Datenbank einfügen möchten, anstatt vorhandene Objekte zu aktualisieren, sollten Sie Folgendes tun:
%Vor%Wenn Sie nun SubmitChanges () aufrufen, wird bei Bedarf sowohl ein INSERT als auch ein UPDATE generiert. Je nachdem, wie schnell Sie einen Primärschlüssel für Ihr neues Objekt benötigen, können Sie ihn sofort senden, um das Objekt zu senden, die Änderungsverfolgung zu leeren und Ihren neuen Primärschlüssel zu erhalten.
Es gibt INotifyPropertyChanging- und INotifyPropertyChanged-Interfaces, bei denen bestimmte Methoden beim Einfügen ausgelöst werden, sodass Sie wissen, ob das Objekt fehlerhaft ist. Wenn Sie SQLMetal verwenden, geschieht dies automatisch. Wenn Sie eigene Entitätsklassen schreiben, müssen Sie diese Klempner selbst manuell schreiben. Ich bin mir jedoch nicht sicher, ob diese Lösung aus Sicht der Skalierbarkeit geeignet ist. Ich habe es nicht getestet. Es scheint, dass es möglicherweise Probleme gibt, da es ein Ereignis auf dem Computer auslöst, der das Einfügen ausführt.
Die Frage How kann ich einer LINQ to SQL-Entität eine "IsDirty" -Eigenschaft hinzufügen? hat eine Antwort von ongle , wie die IsDirty-Eigenschaft mithilfe des PropertyChanged-Ereignisses implementiert wird.
Einschränkung: Es zeigt IsDirty als wahr, wenn die Eigenschaft geändert wurde, aber rückgängig machen.
Tags und Links c# linq linq-to-sql