M365Con 2027 – die kostenlose Online-Konferenz · 11–22 Jan 2027 · 120 sessions→ m365con.net

Blog · Mirko Peters

LINQ to SQL: CRUD-Operationen und Change Tracking meistern

Von · · Aktualisiert

Willkommen zurück zum Podcast! Heute vertiefen wir unsere jüngsten Diskussionen über Datenzugriffsstrategien. Wenn Sie die grundlegenden Debatten sur…

Automatisch mit KI aus dem Originalbeitrag übersetzt. Englisches Original lesen

▶ BLOGMastering CRUDOperations and Change…M365.FM
Titelbild: Mastering CRUD Operations and Change Tracking in LINQ to SQL

Willkommen zurück zum Podcast! Heute vertiefen wir unsere jüngsten Diskussionen über Datenzugriffsstrategien. Wenn Sie die grundlegenden Debatten rund um Datenbank-Frameworks nachholen möchten, hören Sie unbedingt unsere passende Folge zu LINQ to SQL vs. EF Core für den .NET-Datenzugriff. In diesem Deep Dive werfen wir einen Blick hinter die Kulissen, wie der DataContext Identitätsverfolgung, Einfügungen, Aktualisierungen und Löschvorgänge verwaltet, damit Ihre Datenbankinteraktionen effizient und sicher bleiben.

Einführung in die Identitätsverfolgung des DataContext

Wenn Sie in .NET robuste datengetriebene Anwendungen entwickeln, ist es entscheidend zu verstehen, wie Ihr ORM die Objektidentität verwaltet. Der DataContext in LINQ to SQL fungiert als Identitätsmap und Change Tracker. Wenn Sie innerhalb der Lebensdauer eines einzelnen Kontexts dieselbe Datenbankzeile mehrfach abfragen, erzeugt LINQ to SQL keine mehrfachen doppelten Objektinstanzen im Speicher. Stattdessen verwaltet es eine Referenz auf genau dieselbe Objektinstanz. Diese integrierte Identitätsverfolgung verhindert Synchronisierungsfehler, reduziert den Speicherbedarf und bildet die Grundlage für eine effiziente Änderungserkennung, wenn Ihre Änderungen anschließend an SQL Server übermittelt werden.

Verwaltung von Entitätszuständen und Change Tracking

Change Tracking ist das Herzstück Ihrer Datenverarbeitungs-Workflows. Sobald Sie Entitäten laden, deren Eigenschaften ändern oder neue Entitäten instanziieren, hält der DataContext jeden Zustandsübergang akribisch fest. Er überwacht, ob ein Objekt neu, unverändert, geändert oder zum Löschen markiert ist. Da das Framework diese interne Zustandsmaschine pflegt, müssen Sie keinen mühsamen Boilerplate-Code schreiben, um manuell zu prüfen, welche Felder sich geändert haben. Wenn Sie schließlich Ihre Commit-Logik aufrufen, weiß der Kontext automatisch genau, welche Zeilen mit der Datenbank synchronisiert werden müssen. So bleibt die Anwendungslogik übersichtlich, wartbar und bemerkenswert schlank.

Einfügen von Datensätzen und Verständnis der Zustandsübergänge

Neue Daten in Ihre SQL-Server-Datenbank einzufügen sollte intuitiv sein, und LINQ to SQL erreicht das durch eine klare Trennung zwischen der Erstellung von Objekten und der Persistierung in der Datenbank. Wenn Sie einen Datensatz einfügen möchten, instanziieren Sie Ihre Entitätsklasse, weisen ihren Eigenschaften Werte zu und registrieren das Objekt im Kontext.

Intern führt der Aufruf von InsertOnSubmit dazu, dass Ihre Entität in den Zustand „ausstehendes Einfügen“ übergeht. Der Datenkontext vermerkt diese Absicht, ohne sofort einen Datenbankbefehl auszulösen. So können Sie Operationen bündeln oder mehrere Ergänzungen innerhalb einer einzigen Arbeitseinheit koordinieren. Sobald Sie SubmitChanges() aufrufen, übersetzt das Framework diese Objektzustände in optimierte SQL-INSERT-Anweisungen, übernimmt die Generierung der Primärschlüssel und aktualisiert Ihren lokalen Objektgraphen mit allen von der Datenbank erzeugten Werten.

Aktualisierungen und Konfliktlösung

Das Aktualisieren bestehender Datensätze erfordert einen Ausgleich zwischen Entwicklerkomfort und Datenintegrität. Mit LINQ to SQL folgt die Aktualisierung von Daten meist einem einfachen Muster aus Abruf, Änderung und Übermittlung: Sie fragen den Datensatz ab, ändern seine Eigenschaftswerte und senden die Änderungen ab. In Unternehmensumgebungen sind jedoch robuste Konfliktlösungen unverzichtbar.

Da mehrere Benutzer oder Threads versuchen könnten, dieselbe Zeile gleichzeitig zu ändern, setzt das Framework optimistische Nebenläufigkeitskontrollen ein. Durch den Vergleich der vom Kontext geladenen Originalwerte mit dem aktuellen Zustand der Datenbank bei der Übermittlung kann LINQ to SQL Verletzungen der Nebenläufigkeit erkennen. Tritt eine Kollision auf, das heißt, hat ein anderer Prozess den Datensatz in der Zwischenzeit aktualisiert, wird eine Ausnahme ausgelöst. So kann Ihre Anwendung Nebenläufigkeitskonflikte kontrolliert behandeln, anstatt geschäftskritische Daten stillschweigend zu überschreiben.

Sichere Löschvorgänge und Wahrung der referenziellen Integrität

Das Löschen von Datensätzen ist mehr als das bloße Entfernen einer Zeile; es erfordert die Wahrung strikter referenzieller Integrität in Ihrem relationalen Datenbankschema. LINQ to SQL stellt Mechanismen wie DeleteOnSubmit für einzelne Entitäten und Bulk-Erweiterungen zur gleichzeitigen Verarbeitung mehrerer Datensätze bereit.

Bevor Sie einen Löschvorgang ausführen, müssen Fremdschlüsselbeziehungen und abhängige untergeordnete Tabellen unbedingt berücksichtigt werden. Wird ein übergeordneter Datensatz gelöscht, ohne die untergeordneten Datensätze zu behandeln oder kaskadierend zu löschen, löst die Datenbank Ausnahmen aus. Wenn historische Prüfpfade eine Rolle spielen, setzen Entwickler häufig auf eine Soft-Delete-Strategie: Statt die Zeile physisch zu entfernen, wird das Flag IsDeleted über LINQ aktualisiert. So bleibt die relationale Integrität erhalten, und inaktive Daten werden in den regulären Abfragen der Anwendung ausgeblendet.

Leistungsoptimierung für CRUD-Vorgänge

Um die Effizienz Ihrer CRUD-Vorgänge zu maximieren, sind gezielte Optimierungen erforderlich. Nicht optimiertes Change Tracking oder zu viele einzelne Datenbankaufrufe können die Anwendungsleistung schnell beeinträchtigen. Damit Ihr System blitzschnell reagiert, sollten Sie folgende Optimierungsstrategien berücksichtigen:

  • Begrenzen Sie Umfang und Lebensdauer Ihrer DataContext-Instanzen, um übermäßigen Speicherverbrauch und veraltete zwischengespeicherte Entitäten zu vermeiden.
  • Verwenden Sie Projektionen (die Select-Klausel), um nur die Spalten abzurufen, die Sie tatsächlich benötigen. So reduzieren Sie den Netzwerkverkehr und die Speicherbelegung.
  • Implementieren Sie serverseitiges Paging mit Skip und Take, statt ganze Tabellen in den Speicher zu laden.
  • Nutzen Sie kompilierte Abfragen für wiederkehrende, parametrisierte Leseoperationen, um den Aufwand für die SQL-Übersetzung zu umgehen.
  • Bündeln Sie Ihre Operationen gezielt und verwenden Sie Massenaktualisierungen oder Massenlöschungen, wenn große Datenmengen anfallen.

Fazit

Wer CRUD-Vorgänge und Change Tracking in LINQ to SQL beherrscht, verschafft sich beim Entwickeln leistungsstarker und wartbarer .NET-Anwendungen einen deutlichen Vorteil. Wenn Sie verstehen, wie der DataContext Objektidentität, Zustandsübergänge und Parallelitätskonflikte verarbeitet und welche Optimierungen möglich sind, schreiben Sie sauberen C#-Code, der sich nahtlos in effiziente SQL-Server-Befehle übersetzt. Für einen umfassenderen Vergleich architektonischer Datenzugriffsentscheidungen hören Sie unbedingt auch unsere Folge zu LINQ to SQL vs. EF Core für den Datenzugriff in .NET. Probieren Sie diese Muster in Ihren eigenen Projekten aus, verfeinern Sie Ihre Change-Tracking-Workflows und halten Sie Ihre Datenschicht auf Höchstleistung!

Entitäten in diesem Artikel

.NET Referential integrity

Verwandte Artikel

RSS