Condividi tramite


Procedura dettagliata: utilizzo di un timestamp con il controllo LinqDataSource per controllare l'integrità dei dati

Aggiornamento: novembre 2007

In questa procedura dettagliata verrà illustrato come utilizzare un timestamp per verificare i conflitti di dati quando si aggiornano i dati utilizzando un controllo LinqDataSource. Il controllo LinqDataSource archivia il valore di timestamp nella pagina Web. Quando l'utente aggiorna o elimina dati, il controllo LinqDataSource verifica il valore di timestamp rispetto al valore di timestamp corrente presente nel database. Se il controllo LinqDataSource rileva che il valore nella colonna timestamp è stato modificato, il record non verrà aggiornato o eliminato. In tal caso, il record è stato modificato da un altro processo. Il controllo LinqDataSource genera invece un'eccezione per indicare che il record è stato modificato.

Una colonna timestamp viene aggiornata automaticamente da SQL Server ogni volta che viene modificato il record. Per ulteriori informazioni, vedere timestamp (Transact-SQL). Nella classe di entità la colonna timestamp è contrassegnata dalla proprietà IsVersion impostata su true.

Se non si utilizza una colonna timestamp, il controllo LinqDataSource verifica la concorrenza dei dati archiviando i valori nella pagina Web. I valori di concorrenza sono costituiti da colonne utilizzate come chiave primaria nella tabella o contrassegnate con UpdateCheck.Always o UpdateCheck.WhenUpdated nella proprietà UpdateCheck dell'attributo ColumnAttribute. LINQ to SQL controlla tali valori rispetto al database prima che i dati vengano aggiornati o eliminati. Questo approccio può creare una pagina Web di grandi dimensioni se il record di dati contiene molte colonne o valori di colonna elevati. Può rappresentare anche un rischio per la sicurezza se il record contiene dati che non si desidera esporre nella pagina.

Verrà utilizzato Object Relational Designer per creare una classe che rappresenta la tabella di database. Il controllo LinqDataSource interagirà con questa classe generata per recuperare, aggiornare, inserire ed eliminare i dati.

Prerequisiti

Per implementare le procedure nell'ambiente di sviluppo in uso è necessario:

  • Visual Web Developer Express Edition o Visual Studio 2008.

  • SQL Server Express Edition installato nel computer. Se è stato installato SQL Server, è possibile utilizzare tale applicazione, ma sarà necessario apportare piccole modifiche ad alcune procedure.

  • Un sito Web ASP.NET.

Creazione di una tabella di database

Per eseguire i passaggi di questa procedura dettagliata è necessario disporre di una tabella di database contenente una colonna timestamp. Se non si dispone già di tale tabella, è possibile crearne una seguendo i passaggi illustrati nella procedura riportata di seguito. Se si utilizza una tabella esistente, i passaggi di alcune procedure non corrisponderanno precisamente al database ma i concetti illustrati nella procedura dettagliata saranno gli stessi.

Per creare una tabella di database con una colonna timestamp

  1. Se il sito Web non dispone già di una cartella App_Data, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi cartella ASP.NET, quindi App_Data.

  2. Fare clic con il pulsante destro del mouse sulla cartella App_Data, quindi scegliere Aggiungi nuovo elemento.

  3. In Modelli installati selezionare Database SQL, modificare il nome file in Reviews.mdf, quindi fare clic su Aggiungi.

  4. In Esplora server aprire il nodo Reviews.mdf, quindi fare clic con il pulsante destro del mouse sulla cartella Tabelle.

  5. Scegliere Aggiungi nuova tabella.

  6. Creare nella tabella le seguenti colonne:

    Nome colonna

    Tipo di dati

    Proprietà

    BookID

    int

    IsIdentity = Yes

    Not null

    Chiave primaria

    Title

    nvarchar(50)

    Author

    nvarchar(50)

    RecommendToBookGroup

    bit

    Not null

    Review

    nvarchar(1000)

    Timestamp

    timestamp

    Not null

  7. Salvare la tabella e denominarla BookReviews.

  8. Aggiungere alcuni record alla tabella BookReviews con dati di esempio.

    In Esplora server fare clic con il pulsante destro del mouse sulla tabella BookReviews e scegliere Mostra dati tabella. Non è necessario specificare un valore per BookID o Timestamp perché tali valori vengono generati dal database.

Creazione di classi per rappresentare le entità di database

Per utilizzare il controllo LinqDataSource, è necessario disporre delle classi che rappresentano le entità di database. Per creare queste classi, è possibile utilizzare un strumento disponibile in Visual Web Developer Express Edition o Visual Studio 2008.

Per creare una classe per la tabella BookReviews

  1. Se nel sito Web non è già presente una cartella App_Code, in Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi cartella ASP.NET, quindi fare clic su App_Code.

  2. Fare clic con il pulsante destro del mouse sulla cartella App_Code, quindi scegliere Aggiungi nuovo elemento.

  3. In Modelli installati selezionare Classi LINQ to SQL, rinominare il file Reviews.dbml, quindi fare clic su Aggiungi.

    Verrà visualizzata la finestra Progettazione relazionale oggetti.

  4. In Esplora server trascinare la tabella BookReviews nella finestra Progettazione relazionale oggetti.

    La tabella BookReviews e le relative colonne sono rappresentate come entità denominata BookReview nella finestra di progettazione.

  5. Salvare il file Reviews.dbml.

  6. In Esplora soluzioni aprire il file Reviews.designer.cs o Reviews.designer.vb.

    L'entità contiene ora le classi denominate ReviewsDataContext e BookReview. Gli attributi di colonna per tutte le colonne sono contrassegnati con UpdateCheck=UpdateCheck.Never. L'attributo di colonna per la colonna timestamp è tuttavia contrassegnato con IsVersion=true.

  7. Chiudere il file Reviews.dbml.

Creazione e configurazione di un controllo LinqDataSource

A questo punto si dispone di una tabella di database e delle classi che rappresentano le entità di database. È possibile utilizzare un controllo LinqDataSource in una pagina Web ASP.NET per gestire i dati da visualizzare e aggiornare.

Per creare e configurare un controllo LinqDataSource

  1. In Visual Studio creare una nuova pagina Web ASP.NET e passare alla visualizzazione Origine.

  2. Dalla scheda Dati della Casella degli strumenti trascinare un controllo LinqDataSource nell'elemento form della pagina Web.

    È possibile lasciare LinqDataSource1 come valore per la proprietà ID.

  3. Impostare la proprietà ContextTypeName su ReviewsDataContext.

  4. Impostare la proprietà TableName su BookReviews.

  5. Impostare le proprietà EnableUpdate e EnableDelete su true.

    Nell'esempio seguente viene illustrato il codice dichiarativo per il controllo LinqDataSource.

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

Aggiunta di un controllo per la visualizzazione e l'aggiornamento dei dati

È possibile ora aggiungere un controllo DetailsView e associarlo al controllo LinqDataSource. Il controllo DetailsView consente agli utenti di visualizzare e aggiornare i dati gestiti dal controllo LinqDataSource.

Per associare un controllo DetailsView ai dati di un controllo LinqDataSource

  1. Nella scheda Dati della Casella degli strumenti fare doppio clic sul controllo DetailsView per aggiungerlo alla pagina.

    È possibile lasciare DetailsView1 come valore per la proprietà ID.

  2. Impostare la proprietà DataSourceID su LinqDataSource1.

  3. Impostare la proprietà DataKeyNames su BookID.

    È necessario impostare la proprietà DataKeyNames se si desidera utilizzare il controllo DetailsView per aggiornare o eliminare i dati.

  4. Impostare la proprietà AllowPaging su true.

  5. Impostare le proprietà AutoGenerateEditButton e AutoGenerateDeleteButton su true.

    Nell'esempio seguente viene illustrato il markup dichiarativo.

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

    Nel database BookReviews, le colonne BookID e Timestamp vengono impostate automaticamente dal database. Gli utenti non possono modificarne i valori.

  6. Salvare le modifiche.

  7. Premere CTRL+F5 per visualizzare la pagina in un browser.

    Nel controllo DetailsView vengono visualizzate le colonne per il record corrente dalla tabella BookReviews.

  8. Chiudere il browser.

Verifica dei conflitti di dati

Per vedere come la colonna timestamp impedisce gli aggiornamenti quando vengono modificati i dati, è possibile eseguire un test. Selezionare un record da aggiornare in una pagina Web ma modificare tale record al di fuori della pagina Web. Quando si invia l'aggiornamento tramite la pagina Web, il controllo LinqDataSource bloccherà l'aggiornamento.

Per verificare l'integrità dei dati

  1. Premere CTRL+F5 per visualizzare la pagina in un browser.

  2. Selezionare un record, quindi fare clic sul collegamento Modifica. Non aggiornare ancora il record.

  3. In Esplora server fare clic con il pulsante destro del mouse sulla tabella BookReviews e scegliere Mostra dati tabella.

  4. Modificare un valore nello stesso record aperto nel browser Web.

  5. Chiudere la finestra per scrivere la modifica nel database.

    Quando la modifica viene salvata, la colonna timestamp per il record viene aggiornata automaticamente da SQL Server.

  6. Nel browser Web modificare un valore nel record da aggiornare.

  7. Fare clic sul collegamento Aggiorna.

    Verrà visualizzato un messaggio di errore per indicare che la riga è stata modificata. Il timestamp salvato nella pagina non corrisponde al timestamp del record presente nel database.

    Se si desidera eseguire un'azione quando viene visualizzato questo errore, è possibile creare un gestore per l'evento Updating.

Passaggi successivi

In questa procedura dettagliata è stato illustrato come ottimizzare i controlli di integrità dei dati quando si utilizza il controllo LinqDataSource. È possibile sfruttare ulteriormente le funzionalità del controllo LinqDataSource nei seguenti modi:

Vedere anche

Concetti

Cenni preliminari sul controllo server Web LinqDataSource

Riferimenti

LinqDataSource