Exemplarische Vorgehensweise: Verwenden eines Timestamps mit dem LinqDataSource-Steuerelement zum Überprüfen der Datenintegrität

Aktualisiert: November 2007

In dieser exemplarischen Vorgehensweise wird gezeigt, wie Sie Daten mit einem Timestamp auf Konflikte überprüfen, wenn Sie Daten mit einem LinqDataSource-Steuerelement aktualisieren. Das LinqDataSource-Steuerelement speichert den Timestampwert auf der Webseite. Wenn der Benutzer Daten aktualisiert oder löscht, wird der Timestampwert vom LinqDataSource-Steuerelement anhand des aktuellen Timestampwerts in der Datenbank überprüft. Wenn das LinqDataSource-Steuerelement feststellt, dass sich der Wert in der Timestampspalte geändert hat, wird der Datensatz vom Steuerelement nicht aktualisiert oder gelöscht. Der Datensatz wurde in diesem Fall durch einen anderen Vorgang geändert. Stattdessen wird vom LinqDataSource-Steuerelement eine Ausnahme ausgelöst, die anzeigt, dass sich der Datensatz geändert hat.

Eine Timestampspalte wird von SQL Server jedes Mal automatisch aktualisiert, wenn der Datensatz geändert wird. Weitere Informationen finden Sie unter Timestamp (Transact-SQL). In der Entitätsklasse wird eine Timestampspalte dadurch markiert, dass ihre IsVersion-Eigenschaft auf true festgelegt ist.

Wenn Sie keine Timestampspalte verwenden, wird die Datenparallelität vom LinqDataSource-Steuerelement durch Speichern von Werten auf der Webseite überprüft. Parallelitätswerte bestehen aus Spalten, die in der Tabelle als Primärschlüssel verwendet werden oder die mit UpdateCheck.Always oder UpdateCheck.WhenUpdated in der UpdateCheck-Eigenschaft des ColumnAttribute-Attributs gekennzeichnet sind. LINQ to SQL vergleicht diese Werte mit denen in der Datenbank, bevor die Daten aktualisiert oder gelöscht werden. Durch dieses Vorgehen kann eine große Webseite entstehen, wenn der Datensatz viele Spalten oder große Spaltenwerte enthält. Außerdem kann es ein Sicherheitsrisiko darstellen, wenn der Datensatz Daten enthält, die Sie nicht auf der Seite offenlegen sollten.

Mit dem O/R-Designer erstellen Sie eine Klasse, die die Datenbanktabelle darstellt. Das LinqDataSource-Steuerelement interagiert mit dieser generierten Klasse, um die Daten abzurufen, zu aktualisieren, einzufügen und zu löschen.

Vorbereitungsmaßnahmen

Zur Implementierung dieser Prozeduren in Ihrer eigenen Entwicklungsumgebung ist Folgendes erforderlich:

  • Visual Web Developer Express Edition oder Visual Studio 2008.

  • SQL Server Express Edition auf dem Computer installiert. Sie können auch einen installierten SQL Server verwenden, jedoch müssen Sie an einigen der Prozeduren kleine Anpassungen vornehmen.

  • Eine ASP.NET-Website.

Erstellen einer Datenbanktabelle

Um die Schritte dieser exemplarischen Vorgehensweise durchzuführen, benötigen Sie eine Datenbanktabelle mit einer Timestampspalte. Wenn Sie über keine solche Tabelle verfügen, können Sie diese erstellen, indem Sie die Schritte in der folgenden Prozedur ausführen. Wenn Sie eine vorhandene Tabelle verwenden, entsprechen die Schritte in einigen der Prozeduren nicht genau Ihrer verwendeten Datenbank. Trotzdem gelten jedoch die in der exemplarischen Vorgehensweise veranschaulichten Konzepte.

So erstellen Sie eine Datenbanktabelle mit einer Timestampspalte

  1. Wenn die Website nicht bereits über den Ordner App_Data verfügt, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, klicken Sie auf ASP.NET-Ordner hinzufügen, und klicken Sie dann auf App_Data.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner App_Data, und klicken Sie dann auf Neues Element hinzufügen.

  3. Wählen Sie unter Installierte Vorlagen die Option SQL-Datenbank aus, ändern Sie den Dateinamen in Reviews.mdf, und klicken Sie dann auf Hinzufügen.

  4. Öffnen Sie im Server-Explorer den Knoten Reviews.mdf, und klicken Sie dann mit der rechten Maustaste auf den Ordner Tabellen.

  5. Klicken Sie auf Neue Tabelle hinzufügen.

  6. Erstellen Sie in der Tabelle die folgenden Spalten:

    Spaltenname

    Datentyp

    Eigenschaften

    BookID

    int

    IsIdentity = Ja

    Nicht 0 (null)

    Primärschlüssel

    Title

    nvarchar(50)

    Author

    nvarchar(50)

    RecommendToBookGroup

    bit

    Nicht 0 (null)

    Review

    nvarchar(1000)

    Timestamp

    timestamp

    Nicht 0 (null)

  7. Speichern Sie die Tabelle unter dem Namen BookReviews.

  8. Fügen Sie der Tabelle BookReviews mehrere Datensätze mit Beispieldaten hinzu.

    Klicken Sie im Server-Explorer mit der rechten Maustaste auf die Tabelle BookReviews, und klicken Sie auf Tabellendaten anzeigen. Für BookID oder Timestamp müssen Sie keinen Wert angeben, da dieser von der Datenbank generiert wird.

Erstellen von Klassen zum Darstellen von Datenbankentitäten

Beim Arbeiten mit dem LinqDataSource-Steuerelement arbeiten Sie mit Klassen, die Datenbankentitäten darstellen. In Visual Web Developer Express Edition oder Visual Studio 2008 können Sie diese Klassen mit einem Tool erstellen.

So erstellen Sie eine Klasse für die Tabelle BookReviews

  1. Wenn die Website nicht bereits über den Ordner App_Code verfügt, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, klicken Sie auf ASP.NET-Ordner hinzufügen, und klicken Sie dann auf App_Code.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner App_Code, und klicken Sie dann auf Neues Element hinzufügen.

  3. Wählen Sie unter Installierte Vorlagen die Vorlage LINQ to SQL-Klassen aus, benennen Sie die Datei in Reviews.dbml um, und klicken Sie dann auf Hinzufügen.

    Das Fenster O/R-Designer wird angezeigt.

  4. Ziehen Sie die Tabelle BookReviews im Server-Explorer in das Fenster O/R-Designer.

    Die Tabelle BookReviews und ihre Spalten werden im Designerfenster als Entität mit dem Namen BookReview dargestellt.

  5. Speichern Sie die Datei Reviews.dbml.

  6. Öffnen Sie im Projektmappen-Explorer die Datei Reviews.designer.cs bzw. Reviews.designer.vb.

    Die Entität verfügt jetzt über die Klassen ReviewsDataContext und BookReview. Die Spaltenattribute aller Spalten sind mit UpdateCheck=UpdateCheck.Never gekennzeichnet. Das Spaltenattribut der Timestampspalte ist jedoch mit IsVersion=true gekennzeichnet.

  7. Schließen Sie die Datei Reviews.dbml.

Erstellen und Konfigurieren eines LinqDataSource-Steuerelements

Sie verfügen jetzt über eine Datenbanktabelle und Klassen, die Datenbankentitäten darstellen. Sie können die Daten, die auf einer ASP.NET-Webseite angezeigt und aktualisiert werden sollen, mit einem LinqDataSource-Steuerelement verwalten.

So erstellen und konfigurieren Sie ein LinqDataSource-Steuerelement

  1. Erstellen Sie in Visual Studio eine neue ASP.NET-Webseite, und wechseln Sie zur Quellansicht.

  2. Ziehen Sie von der Registerkarte Daten der Toolbox ein LinqDataSource-Steuerelement auf das form-Element auf der Webseite.

    Sie können die ID-Eigenschaft LinqDataSource1 übernehmen.

  3. Legen Sie die ContextTypeName-Eigenschaft auf ReviewsDataContext fest.

  4. Legen Sie die TableName-Eigenschaft auf BookReviews fest.

  5. Legen Sie die EnableUpdate-Eigenschaft und die EnableDelete-Eigenschaft auf true fest.

    Das folgende Beispiel enthält den deklarativen Code für das LinqDataSource-Steuerelement.

    <asp:LinqDataSource 
      ContextTypeName="ReviewsDataContext" 
      TableName="BookReviews" 
      EnableUpdate="true" 
      EnableDelete="true" 
      ID="LinqDataSource1" 
      >
    </asp:LinqDataSource>
    

Hinzufügen eines Steuerelements zum Anzeigen und Aktualisieren von Daten

Sie können nun ein DetailsView-Steuerelement hinzufügen und es an das LinqDataSource-Steuerelement binden. Mit dem DetailsView-Steuerelement können Benutzer Daten anzeigen und aktualisieren, die vom LinqDataSource-Steuerelement verwaltet werden.

So binden Sie ein DetailsView-Steuerelement an die Daten des LinqDataSource-Steuerelements

  1. Doppelklicken Sie auf der Registerkarte Daten der Toolbox auf das DetailsView-Steuerelement, um es der Seite hinzuzufügen.

    Sie können die ID-Eigenschaft DetailsView1 übernehmen.

  2. Legen Sie die DataSourceID-Eigenschaft auf LinqDataSource1 fest.

  3. Legen Sie die DataKeyNames-Eigenschaft auf BookID fest.

    Sie müssen die DataKeyNames-Eigenschaft festlegen, wenn Sie Daten mithilfe des DetailsView-Steuerelements aktualisieren oder löschen möchten.

  4. Legen Sie die AllowPaging-Eigenschaft auf true fest.

  5. Legen Sie die AutoGenerateEditButton-Eigenschaft und die AutoGenerateDeleteButton-Eigenschaft auf true fest.

    Das folgende Beispiel enthält das deklarative Markup.

    <asp:DetailsView 
      DataSourceID="LinqDataSource1" 
      DataKeyNames="BookID" 
      AutoGenerateEditButton="true"
      AutoGenerateDeleteButton="true"
      AllowPaging="true" 
      ID="DetailsView1" 
      >
    </asp:DetailsView>
    

    In der Datenbank BookReviews werden die Spalten BookID und Timestamp automatisch von der Datenbank festgelegt. Benutzer können deren Werte nicht ändern.

  6. Speichern Sie die Änderungen.

  7. Drücken Sie STRG+F5, um die Seite in einem Browser anzuzeigen.

    Das DetailsView-Steuerelement zeigt die Spalten des aktuellen Datensatzes der Tabelle BookReviews an.

  8. Schließen Sie den Browser.

Überprüfen der Daten auf Konflikte

Sie können einen Test durchführen, um zu überprüfen, wie bei geänderten Daten Aktualisierungen über die Timestampspalte verhindert werden. Dazu wählen Sie in einer Webseite einen zu aktualisierenden Datensatz aus, ändern diesen jedoch außerhalb der Webseite. Wenn Sie die Aktualisierung über die Webseite absenden, wird sie vom LinqDataSource-Steuerelement verhindert.

So testen Sie die Datenintegrität

  1. Drücken Sie STRG+F5, um die Seite in einem Browser anzuzeigen.

  2. Wählen Sie einen Datensatz aus, und klicken Sie dann auf den Link Bearbeiten. Aktualisieren Sie den Datensatz noch nicht.

  3. Klicken Sie im Server-Explorer mit der rechten Maustaste auf die Tabelle BookReviews, und klicken Sie auf Tabellendaten anzeigen.

  4. Ändern Sie einen Wert in dem Datensatz, den Sie im Webbrowser geöffnet haben.

  5. Schließen Sie das Fenster, um die Änderung in die Datenbank zu schreiben.

    Beim Speichern der Änderung wird die Timestampspalte des Datensatzes von SQL Server automatisch aktualisiert.

  6. Ändern Sie im Webbrowser einen Wert des zu aktualisierenden Datensatzes.

  7. Klicken Sie auf den Link Aktualisieren.

    Es wird eine Fehlermeldung mit dem Hinweis angezeigt, dass sich die Zeile geändert hat. Der in der Seite gespeicherte Timestamp entspricht nicht dem Timestamp des Datensatzes in der Datenbank.

    Wenn Sie beim Anzeigen dieses Fehlers eine Aktion durchführen möchten, können Sie einen Handler für das Updating-Ereignis erstellen.

Nächste Schritte

In dieser exemplarischen Vorgehensweise wurde dargestellt, wie Sie Überprüfungen der Datenintegrität mithilfe des LinqDataSource-Steuerelements optimieren können. Sie können die weiteren Vorteile der Fähigkeiten des LinqDataSource-Steuerelements folgendermaßen nutzen:

Siehe auch

Konzepte

Übersicht über das LinqDataSource-Webserversteuerelement

Referenz

LinqDataSource