Exemplarische Vorgehensweise: Anpassen des Einfüge-, Aktualisierungs- und Löschverhaltens in Entitätsklassen

Hinweis

Datasets und verwandte Klassen sind ältere .NET-Technologien aus den frühen 2000er Jahren, die es Anwendungen ermöglichen, mit Daten im Arbeitsspeicher zu arbeiten, während die Anwendungen von der Datenbank getrennt sind. Die Technologien sind besonders nützlich für Anwendungen, die es Benutzern ermöglichen, Daten zu ändern und die Änderungen wieder in der Datenbank zu speichern. Obwohl sich Datasets als sehr erfolgreiche Technologie erwiesen haben, empfehlen wir, dass neue .NET-Anwendungen Entity Framework Core verwenden. Entity Framework bietet eine natürlichere Möglichkeit, mit tabellarischen Daten als Objektmodelle zu arbeiten, und verfügt über eine einfachere Programmierschnittstelle.

Die LINQ to SQL-Tools in Visual Studio bieten eine visuelle Entwurfsoberfläche zum Erstellen und Bearbeiten von LINQ to SQL-Klassen (Entitätsklassen), die auf Objekten in einer Datenbank basieren. Mithilfe von LINQ to SQL kann die LINQ-Technologie für den Zugriff auf SQL-Datenbanken verwendet werden. Weitere Informationen finden Sie unter LINQ (Language Integrated Query).

Standardmäßig wird die Logik für die Durchführung von Updates von der LINQ to SQL-Runtime bereitgestellt. Basierend auf dem Schema der Tabelle (den Spaltendefinitionen und den Primärschlüsselinformationen) werden von der Runtime Insert-, Update- und Delete-Standardanweisungen erstellt. Wenn Sie das Standardverhalten nicht verwenden möchten, können Sie das Updateverhalten konfigurieren und für erforderliche Einfüge-, Update- und Löschvorgänge, die für das Arbeiten mit Daten in der Datenbank notwendig sind, spezielle gespeicherte Prozeduren festlegen. Diese Vorgehensweise ist auch dann sinnvoll, wenn kein Standardverhalten erzeugt wird, z. B. wenn die Entitätsklassen Ansichten zugeordnet sind. Das standardmäßige Updateverhalten kann auch dann überschrieben werden, wenn für die Datenbank der Tabellenzugriff über gespeicherte Prozeduren erforderlich ist. Weitere Informationen finden Sie unter Anpassen von Vorgängen durch Verwendung von gespeicherten Prozeduren.

Hinweis

Für diese exemplarische Vorgehensweise ist die Verfügbarkeit der gespeicherten Prozeduren InsertCustomer, UpdateCustomer und DeleteCustomer für die Datenbank „Northwind“ erforderlich.

In dieser exemplarischen Vorgehensweise werden die zu befolgenden Schritte dargestellt, um mithilfe von gespeicherten Prozeduren das LINQ to SQL-Standardverhalten zur Laufzeit für das Speichern von Daten in einer Datenbank außer Kraft zu setzen.

In dieser exemplarischen Vorgehensweise wird gezeigt, wie Sie die folgenden Aufgaben ausführen:

  • Erstellen einer neuen Windows Forms-Anwendung und Hinzufügen einer LINQ to SQL-Datei

  • Erstellen einer Entitätsklasse, die der Tabelle Customers der Datenbank „Northwind“ zugeordnet ist

  • Erstellen einer Objektdatenquelle, die auf die LINQ to SQL-Klasse Customer verweist

  • Erstellen einer Windows Forms-Anwendung, die eine DataGridView enthält, die an die Customer-Klasse gebunden ist

  • Implementieren der Speicherfunktion für das Formular.

  • Erstellen von DataContext-Methoden durch Hinzufügen von gespeicherten Prozeduren zum O/R-Designer

  • Konfigurieren der Customer-Klasse, um gespeicherte Prozeduren zum Einfügen, Aktualisieren und Löschen zu verwenden

Voraussetzungen

In dieser exemplarischen Vorgehensweise werden SQL Server Express LocalDB und die Northwind-Beispieldatenbank verwendet.

  1. Wenn Sie nicht über SQL Server Express LocalDB verfügen, installieren Sie diese Komponente entweder über die SQL Server Express-Downloadseite oder über den Visual Studio-Installer. Im Visual Studio-Installer können Sie SQL Server Express LocalDB als Teil der Workload Datenspeicherung und -verarbeitung oder als einzelne Komponente installieren.

  2. Installieren Sie die Northwind-Beispieldatenbank, indem Sie die folgenden Schritte ausführen:

    1. Öffnen Sie in Visual Studio das Fenster SQL Server-Objekt-Explorer. (Der SQL Server-Objekt-Explorer wird als Teil der Workload für die Datenspeicherung und -verarbeitung im Visual Studio-Installer installiert.) Erweitern Sie den Knoten SQL Server. Klicken Sie mit der rechten Maustaste auf Ihre LocalDB-Instanz, und wählen Sie Neue Abfrage aus.

      Ein Abfrage-Editor-Fenster wird geöffnet.

    2. Kopieren Sie das Northwind-Transact-SQL-Skript in die Zwischenablage. Dieses T-SQL-Skript erstellt die Northwind-Datenbank von Grund auf neu und füllt sie mit Daten auf.

    3. Fügen Sie das T-SQL-Skript in den Abfrage-Editor ein, und klicken Sie dann auf die Schaltfläche Ausführen.

      Nach kurzer Zeit wird die Ausführung der Abfrage abgeschlossen, und die Northwind-Datenbank wird erstellt.

Erstellen einer Anwendung und Hinzufügen von LINQ to SQL-Klassen

Da Sie mit LINQ to SQL-Klassen arbeiten und die Daten in Windows Forms angezeigt werden, erstellen Sie eine neue Windows Forms-Anwendung, und fügen Sie eine LINQ to SQL-Klassendatei hinzu.

Hinweis

Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in diesem Artikel. Möglicherweise verwenden Sie eine andere Edition von Visual Studio oder andere Umgebungseinstellungen. Weitere Informationen finden Sie unter Personalisieren der IDE.

Erstellen eines neuen Windows Forms-Anwendungsprojekts mit LINQ to SQL-Klassen

  1. Wählen Sie in Visual Studio im Menü Datei die Optionen Neu>Projekt aus.

  2. Erweitern Sie entweder Visual C# oder Visual Basic im linken Bereich, und wählen Sie dann Windows Desktop aus.

  3. Wählen Sie im mittleren Bereich den Projekttyp Windows Forms-App aus.

  4. Nennen Sie das Projekt UpdatingWithSProcsWalkthrough, und wählen Sie OK aus.

    Das Projekt UpdatingwithSProcsWalkthrough wird erstellt und zum Projektmappen-Explorer hinzugefügt.

  5. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.

  6. Klicken Sie auf die Vorlage LINQ to SQL-Klassen, und geben Sie im Feld Name den Namen Northwind.dbml ein.

  7. Klicken Sie auf Hinzufügen.

    Dem Projekt wird eine leere LINQ to SQL-Klassendatei (Northwind.dbml) hinzugefügt, und der O/R-Designer wird geöffnet.

Erstellen der Entitätsklasse „Customer“ und einer Objektdatenquelle

Erstellen Sie LINQ to SQL-Klassen, die den Datenbanktabellen zugeordnet sind, indem Sie Tabellen vom Server-Explorer oder Datenbank-Explorer in den O/R-Designer ziehen. Sie erhalten LINQ to SQL-Entitätsklassen, die den Tabellen in der Datenbank zugeordnet sind. Nachdem die Entitätsklassen erstellt wurden, können sie wie andere Klassen mit öffentlichen Eigenschaften als Objektdatenquellen dienen.

So erstellen Sie eine Customer-Entitätsklasse und konfigurieren damit eine Datenquelle

  1. Suchen Sie im Server-Explorer oder Datenbank-Explorer in der SQL Server-Version der Beispieldatenbank „Northwind“ die Tabelle Customer.

  2. Ziehen Sie den Knoten Customers vom Server-Explorer oder Datenbank-Explorer in den *O/R-Designer.

    Eine Entitätsklasse mit dem Namen Customer wird erstellt. Sie verfügt über Eigenschaften, die den Spalten in der Tabelle Customers entsprechen. Die Entitätsklasse wird Customer (nicht Customers) genannt, da sie einem einzelnen Kunden aus der Tabelle „Customers“ entspricht.

    Hinweis

    Dieses Umbenennungsverhalten wird als Pluralisierung bezeichnet. Sie kann im Dialogfeld Optionen aktiviert oder deaktiviert werden. Weitere Informationen finden Sie unter Vorgehensweise: Aktivieren und Deaktivieren der Pluralisierung (O/R-Designer).

  3. Klicken Sie im Menü Erstellen auf UpdatingwithSProcsWalkthrough erstellen, um das Projekt zu erstellen.

  4. Klicken Sie zum Öffnen des Fensters Datenquellen im Menü Daten auf Datenquellen anzeigen.

  5. Klicken Sie im Datenquellenfenster auf Neue Datenquelle hinzufügen.

  6. Klicken Sie auf Objekt auf der Seite Datenquellentyp auswählen, und wählen Sie dann Weiter aus.

  7. Erweitern Sie den Knoten UpdatingwithSProcsWalkthrough, suchen Sie die Klasse Customer, und wählen Sie diese aus.

    Hinweis

    Wenn die Klasse Customer nicht verfügbar ist, beenden Sie den Assistenten, erstellen Sie das Projekt, und führen Sie den Assistenten erneut aus.

  8. Klicken Sie auf Fertig stellen, um die Datenquelle zu erstellen, und fügen Sie die Entitätsklasse Customer zum Fenster Datenquellen hinzu.

Erstellen einer DataGridView, um Kundendaten in einer Windows Forms-Anwendung anzuzeigen

Erstellen Sie Steuerelemente, die an Entitätsklassen gebunden sind, indem Sie LINQ to SQL-Datenquellenelemente vom Fenster Datenquellen in eine Windows Forms-Anwendung ziehen.

So fügen Sie Steuerelemente hinzu, die an Entitätsklassen gebunden sind

  1. Öffnen Sie Form1 in der Designansicht.

  2. Ziehen Sie den Knoten Customer aus dem Fenster Datenquellen auf Form1.

    Hinweis

    Klicken Sie im Menü Daten auf Datenquellen anzeigen, um das Fenster Datenquellen anzuzeigen.

  3. Öffnen Sie Form1 im Code-Editor.

  4. Fügen Sie dem Formular den folgenden Code hinzu, sodass er global für das Formular gilt und außerhalb einer bestimmten Methode, jedoch innerhalb der Klasse Form1 steht:

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. Erstellen Sie einen Ereignishandler für das Form_Load-Ereignis, und fügen Sie dem Handler den folgenden Code hinzu:

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

Implementieren der Speicherfunktionalität

Die Schaltfläche zum Speichern ist standardmäßig nicht aktiviert, und die Speicherfunktionalität ist nicht implementiert. Auch wird bei Erstellung datengebundener Steuerelemente für Objektdatenquellen nicht automatisch Code hinzugefügt, um geänderte Daten in der Datenbank zu speichern. In diesem Abschnitt wird erklärt, wie die Schaltfläche zum Speichern aktiviert und die Speicherfunktionalität für LINQ to SQL-Objekte implementiert wird.

So implementieren Sie die Speicherfunktionalität

  1. Öffnen Sie Form1 in der Designansicht.

  2. Wählen Sie im CustomersBindingNavigator die Schaltfläche zum Speichern (die Schaltfläche mit dem Diskettensymbol) aus.

  3. Legen Sie im Fenster Eigenschaften die Eigenschaft Aktiviert auf True fest.

  4. Doppelklicken Sie auf die Schaltfläche zum Speichern, um einen Ereignishandler zu erstellen und zum Code-Editor zu wechseln.

  5. Fügen Sie dem Ereignishandler für die Schaltfläche zum Speichern den folgenden Code hinzu:

    northwindDataContext1.SubmitChanges();
    

Außerkraftsetzen des Standardverhaltens für Updates (Einfüge-, Aktualisierungs- und Löschvorgänge)

So überschreiben Sie das standardmäßige Updateverhalten

  1. Öffnen Sie die LINQ to SQL-Datei im O/R-Designer. (Doppelklicken Sie im Projektmappen-Explorer auf die Datei Northwind.dbml.)

  2. Erweitern Sie im Server-Explorer oder Datenbank-Explorer den Knoten Gespeicherte Prozeduren der Datenbank „Northwind“, und suchen Sie die gespeicherten Prozeduren InsertCustomers, UpdateCustomers und DeleteCustomers.

  3. Ziehen Sie alle drei gespeicherten Prozeduren in den O/R-Designer.

    Die gespeicherten Prozeduren werden dem Methodenbereich als DataContext-Methoden hinzugefügt. Weitere Informationen finden Sie unter DataContext-Methoden (O/R-Designer).

  4. Wählen Sie die Entitätsklasse Customer im O/R-Designer aus.

  5. Wählen Sie im Fenster Eigenschaften die Eigenschaft Einfügen aus.

  6. Klicken Sie auf die Auslassungszeichen (...) neben Laufzeit verwenden, um das Dialogfeld Verhalten konfigurieren zu öffnen.

  7. Klicken Sie auf Anpassen.

  8. Wählen Sie aus der Liste Anpassen die InsertCustomers-Methode aus.

  9. Klicken Sie auf Anwenden, um die Konfiguration für die ausgewählte Klasse und das ausgewählte Verhalten zu speichern.

    Hinweis

    Sie können mit der Konfiguration des Verhaltens jeder Klasse/Verhalten-Kombination fortfahren, solange Sie nach jeder Änderung auf Anwenden klicken. Wenn Sie eine Klasse oder ein Verhalten ändern, bevor Sie auf Übernehmen klicken, wird ein Warnungsdialogfeld angezeigt, über das Sie alle Änderungen übernehmen können.

  10. Wählen Sie aus der Liste Verhalten die Option Aktualisieren aus.

  11. Klicken Sie auf Anpassen.

  12. Wählen Sie in der Liste Anpassen die UpdateCustomers-Methode aus.

    Überprüfen Sie die Liste der Methodenargumente und Klasseneigenschaften, und beachten Sie, dass für einige Spalten in der Tabelle zwei Methodenargumente sowie zwei Klasseneigenschaften vorhanden sind. Dies macht es einfacher, Änderungen zu verfolgen und Anweisungen zur Überprüfung von Parallelitätsverletzungen zu erstellen.

  13. Ordnen Sie das Original_CustomerID-Methodenargument der Klasseneigenschaft CustomerID (Original) zu.

    Hinweis

    Standardmäßig werden Methodenargumente Klasseneigenschaften zugeordnet, wenn die Namen übereinstimmen. Wenn Eigenschaftennamen geändert werden und die Namen von Tabelle und Entitätsklasse nicht mehr übereinstimmen, kann es erforderlich sein, die entsprechende zuzuordnende Klasseneigenschaft auszuwählen, wenn die korrekte Zuordnung vom O/R-Designer nicht festgestellt werden kann. Wenn die Methodenargumente nicht über gültige Klasseneigenschaften für die Zuordnung verfügen, können Sie zusätzlich den Wert Klasseneigenschaften auf (Keine) festlegen.

  14. Klicken Sie auf Anwenden, um die Konfiguration für die ausgewählte Klasse und das ausgewählte Verhalten zu speichern.

  15. Wählen Sie aus der Liste Verhalten die Option Löschen aus.

  16. Klicken Sie auf Anpassen.

  17. Wählen Sie in der Liste Anpassen die DeleteCustomers-Methode aus.

  18. Ordnen Sie das Original_CustomerID-Methodenargument der Klasseneigenschaft CustomerID (Original) zu.

  19. Klicken Sie auf OK.

Hinweis

Auch wenn es kein Problem in dieser exemplarischen Vorgehensweise darstellt, ist Folgendes zu beachten: LINQ to SQL verarbeitet bei Einfüge- und Aktualisierungsvorgängen die datenbankgenerierten Werte für Identitätsspalten (automatische Inkrementierung), ROWGUID-Spalten (datenbankgenerierte Globally Unique Identifier, GUID) und Zeitstempelspalten automatisch. Datenbankgenerierte Werte in anderen Spaltentypen führen unerwartet zu einem NULL-Wert. Um die von der Datenbank generierten Werte zurückzugeben, sollten Sie IsDbGenerated manuell auf true und AutoSync auf einen der folgenden Werte festlegen: AutoSync.Always, AutoSync.OnInsert oder AutoSync.OnUpdate.

Testen der Anwendung

Führen Sie die Anwendung erneut aus, um zu überprüfen, ob der Kundendatensatz in der Datenbank von der gespeicherten Prozedur UpdateCustomers ordnungsgemäß aktualisiert wird.

  1. Drücken Sie F5.

  2. Ändern Sie einen Datensatz im Raster, um das Updateverhalten zu testen.

  3. Fügen Sie einen neuen Datensatz hinzu, um das Einfügeverhalten zu testen.

  4. Klicken Sie auf die Speichern-Schaltfläche, um die Änderungen in der Datenbank zu speichern.

  5. Schließen Sie das Formular.

  6. Drücken Sie F5, und überprüfen Sie, ob der aktualisierte Datensatz und der neu eingefügte Datensatz erhalten bleiben.

  7. Löschen Sie den in Schritt 3 erstellten neuen Datensatz, um das Löschverhalten zu testen.

  8. Klicken Sie auf die Schaltfläche „Speichern“, um die Änderungen zu übermitteln und den gelöschten Datensatz aus der Datenbank zu entfernen.

  9. Schließen Sie das Formular.

  10. Drücken Sie F5 und überprüfen Sie, ob der gelöschte Datensatz aus der Datenbank entfernt wurde.

    Hinweis

    Wenn Ihre Anwendung SQL Server Express Edition verwendet, werden beim Drücken von F5 in Schritt 10 die Änderungen möglicherweise nicht angezeigt. Dies ist abhängig vom Wert der Eigenschaft Ins Ausgabeverzeichnis kopieren der Datenbankdatei.

Nächste Schritte

Je nach den Anforderungen Ihrer Anwendung sollten Sie nach dem Erstellen von LINQ to SQL-Entitätsklassen mehrere Schritte ausführen. Hier sind einige Verbesserungen, die Sie an dieser Anwendung vornehmen können: