Procedura dettagliata: personalizzare il comportamento di inserimento, aggiornamento ed eliminazione delle classi di entità

Nota

I set di dati e le classi correlate sono tecnologie .NET Framework legacy dei primi anni '2000 che consentono alle applicazioni di lavorare con i dati in memoria mentre le applicazioni vengono disconnesse dal database. Sono particolarmente utili per le applicazioni che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Anche se i set di dati hanno dimostrato di essere una tecnologia molto efficace, è consigliabile che le nuove applicazioni .NET usino Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e ha un'interfaccia di programmazione più semplice.

Gli strumenti LINQ to SQL in Visual Studio offrono un'area di progettazione visiva per la creazione e la modifica di classi LINQ to SQL (classi di entità) basate su oggetti in un database. Usando LINQ to SQL, è possibile usare la tecnologia LINQ per accedere ai database SQL. Per altre informazioni, vedere LINQ (Language-Integrated Query).

Per impostazione predefinita, la logica per eseguire gli aggiornamenti viene fornita dal runtime LINQ to SQL. Il runtime crea istruzioni , Updatee Delete predefinite Insertin base allo schema della tabella (le definizioni di colonna e le informazioni sulla chiave primaria). Quando non si vuole usare il comportamento predefinito, è possibile configurare il comportamento di aggiornamento e definire stored procedure specifiche per eseguire i comandi di inserimento, aggiornamento ed eliminazione necessari per l'uso dei dati nel database. Questa operazione può essere eseguita anche quando non viene generato il comportamento predefinito, ad esempio quando viene eseguito il mapping delle classi di entità alle visualizzazioni. Inoltre, è possibile eseguire l'override del comportamento di aggiornamento predefinito quando il database richiede l'accesso alla tabella tramite stored procedure. Per altre informazioni, vedere Personalizzazione delle operazioni tramite stored procedure.

Nota

In questa procedura dettagliata è richiesta la disponibilità delle stored procedure InsertCustomer, UpdateCustomer e DeleteCustomer per il database Northwind.

Questa procedura dettagliata illustra i passaggi da seguire per eseguire l'override del comportamento di runtime predefinito di LINQ to SQL per il salvataggio dei dati in un database tramite stored procedure.

Durante questa procedura dettagliata si apprenderà come eseguire le attività seguenti:

  • Creare una nuova applicazione Windows Form e aggiungervi un file LINQ to SQL.

  • Creare una classe di entità mappata alla tabella Northwind Customers .

  • Creare un'origine dati oggetto che fa riferimento alla classe LINQ to SQL Customer .

  • Creare un Windows Form contenente un DataGridView oggetto associato alla Customer classe .

  • Implementazione della funzionalità di salvataggio per il form.

  • Creare DataContext metodi aggiungendo stored procedure alla finestra di progettazione O/R.

  • Configurare la classe per l'uso Customer di stored procedure per eseguire inserimenti, aggiornamenti ed eliminazioni.

Prerequisiti

Questa procedura dettagliata usa sql Server Express Local DB e il database di esempio Northwind.

  1. Se SQL Server Express Local DB non è disponibile, installarlo dalla pagina di download di SQL Server Express o tramite il Programma di installazione di Visual Studio. Nella Programma di installazione di Visual Studio è possibile installare SQL Server Express Local DB come parte del carico di lavoro Archiviazione ed elaborazione dei dati o come singolo componente.

  2. Installare il database di esempio Northwind seguendo questa procedura:

    1. In Visual Studio aprire la finestra Esplora oggetti di SQL Server. SQL Server Esplora oggetti viene installato come parte del carico di lavoro Archiviazione ed elaborazione dati nel Programma di installazione di Visual Studio. Espandere il nodo SQL Server. Fare clic con il pulsante destro del mouse sull'istanza di Local DB e scegliere Nuova query.

      Verrà visualizzata una finestra dell'editor di query.

    2. Copiare lo script Transact-SQL Northwind negli Appunti. Questo script T-SQL crea il database Northwind da zero e lo popola con i dati.

    3. Incollare lo script T-SQL nell'editor di query e quindi scegliere il pulsante Esegui .

      Dopo un breve periodo di tempo, la query termina l'esecuzione e viene creato il database Northwind.

Creazione di un'applicazione e aggiunta di classi LINQ to SQL

Poiché si utilizzano classi LINQ to SQL e si visualizzano i dati in un Windows Form, creare una nuova applicazione Windows Form e aggiungere un file LINQ to SQL Classes.

Nota

I nomi o i percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio in questo articolo potrebbero essere diversi nel computer in uso. È possibile usare un'edizione diversa di Visual Studio o impostazioni di ambiente diverse. Per altre informazioni, vedere Personalizzare l'IDE.

Per creare un nuovo progetto di applicazione di Windows Form che contiene classi LINQ to SQL

  1. Nel menu File in Visual Studio selezionare Nuovo>Progetto.

  2. Espandere Visual C# o Visual Basic nel riquadro a sinistra, quindi selezionare Desktop di Windows.

  3. Nel riquadro centrale selezionare il tipo di progetto Windows Form app.

  4. Assegnare al progetto il nome UpdatingWithSProcsWalkthrough e quindi scegliere OK.

    Il progetto UpdatingwithSProcsWalkthrough viene creato e aggiunto a Esplora soluzioni.

  5. Dal menu Progetto fare clic su Aggiungi nuovo elemento.

  6. Fare clic sul modello Classi LINQ to SQL e digitare Northwind.dbml nella casella Nome.

  7. Fare clic su Aggiungi.

    Al progetto viene aggiunto un file LINQ to SQL Classes (Northwind.dbml) vuoto e viene aperto O/R Designer .

Creare la classe di entità Customer e l'origine dati dell'oggetto

Creare classi LINQ to SQL mappate alle tabelle di database trascinando le tabelle da Esplora server o Esplora database in Progettazione O/R. Il risultato è rappresentato da classi di entità LINQ to SQL con mapping alle tabelle nel database. Dopo aver creato le classi di entità, è possibile usarle come origini dati di un oggetto analogamente alle altre classi che dispongono di proprietà pubbliche.

Per creare una classe di entità Customer e configurare un'origine dati con tale classe

  1. In Esplora server o Esplora database individuare la tabella Customer nella versione di SQL Server del database di esempio Northwind.

  2. Trascinare il nodo Customers da Esplora server o Esplora database nell'area *O/R Designer .

    Viene creata una classe di entità denominata Customer, che presenta proprietà corrispondenti alle colonne della tabella Customers. La classe di entità viene denominata Customer (e non Customers) perché rappresenta un solo cliente della tabella Customers.

    Nota

    Questo comportamento di ridenominazione viene definito pluralizzazione. Può essere attivato o disattivato nella finestra di dialogo Opzioni. Per altre informazioni, vedere Procedura: Attivare e disattivare la pluralizzazione (Progettazione O/R).

  3. Scegliere Compila UpdatingwithSProcsWalkthrough dal menu Compila per compilare il progetto.

  4. Per aprire la finestra Origini dati, scegliere Mostra origini dati dal menu Dati.

  5. Nella finestra Origini dati fare clic su Aggiungi nuova origine dati.

  6. Nella pagina Seleziona un tipo di origine dati fare clic su Oggetto e quindi su Avanti.

  7. Espandere il nodo UpdatingwithSProcsWalkthrough e quindi individuare e selezionare la classe Customer.

    Nota

    Se la classe Customer non è disponibile, chiudere la procedura guidata, compilare il progetto ed eseguire nuovamente la procedura guidata.

  8. Fare clic su Fine per creare l'origine dati e aggiungere la classe di entità Customer alla finestra Origini dati.

Creare un oggetto DataGridView per visualizzare i dati dei clienti in un Windows Form

Creare controlli associati alle classi di entità trascinando gli elementi dell'origine dati LINQ to SQL dalla finestra Origini dati in un Windows Form.

Per aggiungere controlli associati alle classi di entità

  1. Aprire Form1 nella visualizzazione Progettazione.

  2. Trascinare il nodo Customer dalla finestra Origini dati in Form1.

    Nota

    Per visualizzare la finestra Origini dati, scegliere Mostra origini dati dal menu Dati.

  3. Aprire Form1 nell'editor del codice.

  4. Aggiungere il codice seguente al form, globale al form, all'esterno di un metodo specifico, ma all'interno della Form1 classe :

    private NorthwindDataContext northwindDataContext1
        = new NorthwindDataContext();
    
  5. Creare un gestore eventi per l'evento Form_Load e aggiungere il seguente codice al gestore:

    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

Implementare la funzionalità di salvataggio

Per impostazione predefinita, il pulsante Salva non è abilitato e la funzionalità di salvataggio non è implementata. Inoltre, quando vengono creati controlli associati a dati per le origini dati di un oggetto, non viene aggiunto codice automaticamente per salvare i dati modificati nel database. Questa sezione illustra come abilitare il pulsante Salva e implementare la funzionalità di salvataggio per gli oggetti LINQ to SQL.

Per implementare la funzionalità di salvataggio

  1. Aprire Form1 nella visualizzazione Progettazione.

  2. Selezionare il pulsante Salva in CustomerBindingNavigator (il pulsante con l'icona del disco floppy).

  3. Nella finestra Proprietà impostare la proprietà Enabled su True.

  4. Fare doppio clic sul pulsante Salva per creare un gestore eventi e passare all'editor del codice.

  5. Aggiungere il seguente codice nel gestore eventi del pulsante Salva:

    northwindDataContext1.SubmitChanges();
    

Eseguire l'override del comportamento predefinito per l'esecuzione di aggiornamenti (inserimenti, aggiornamenti ed eliminazioni)

Per eseguire l'override del comportamento di aggiornamento predefinito

  1. Aprire il file LINQ to SQL in Progettazione O/R. (Fare doppio clic sul file Northwind.dbml in Esplora soluzioni.)

  2. In Esplora server o Esplora database espandere il nodo Stored procedure dei database Northwind e individuare le stored procedure InsertCustomers, UpdateCustomers e DeleteCustomers.

  3. Trascinare tutte e tre le stored procedure in Progettazione O/R.

    Le stored procedure vengono aggiunte al riquadro dei metodi come metodi DataContext. Per altre informazioni, vedere Metodi DataContext (O/R Designer).For more information, see DataContext methods (O/R Designer)).

  4. Selezionare la classe di entità Customer in Progettazione O/R.

  5. Nella finestra Proprietà selezionare la proprietà Insert.

  6. Fare clic sui puntini di sospensione (...) accanto a Usa fase di esecuzione per aprire la finestra di dialogo Configura comportamento.

  7. Seleziona Personalizza.

  8. Selezionare il metodo InsertCustomers nell'elenco Personalizza.

  9. Fare clic su Applica per salvare la configurazione relativa alla classe e al comportamento selezionati.

    Nota

    È possibile continuare a configurare il comportamento per ogni combinazione di classe/comportamento purché si faccia clic su Applica dopo ogni modifica apportata. Se si modifica la classe o il comportamento prima di fare clic su Applica, viene visualizzata una finestra di dialogo di avviso che consente di applicare eventuali modifiche.

  10. Selezionare Aggiorna nell'elenco Comportamento.

  11. Seleziona Personalizza.

  12. Selezionare il metodo UpdateCustomers nell'elenco Personalizza.

    Controllare l'elenco di Argomenti metodo e Proprietà classe e notare che sono disponibili due Argomenti metodo e due Proprietà classe per alcune colonne nella tabella. In tal modo, vengono facilitati il rilevamento delle modifiche e la creazione di istruzioni che verifichino la presenza di eventuali violazioni di concorrenza.

  13. Eseguire il mapping dell'argomento di metodo Original_CustomerID alla proprietà di classe CustomerID (Original).

    Nota

    Per impostazione predefinita, verrà eseguito il mapping degli argomenti di metodo alle proprietà di classe quando i nomi corrispondono. Se i nomi di proprietà vengono modificati e non vi è più corrispondenza tra quelli della tabella e quelli della classe di entità, potrebbe essere necessario selezionare la proprietà di classe equivalente di cui eseguire il mapping nel caso in cui Object Relational Designer non sia in grado di determinare il mapping corretto. Inoltre, se per gli argomenti di metodo non sono disponibili proprietà di classe valide per il mapping, è possibile impostare il valore Proprietà classe su (Nessuna).

  14. Fare clic su Applica per salvare la configurazione relativa alla classe e al comportamento selezionati.

  15. Selezionare Elimina nell'elenco Comportamento.

  16. Seleziona Personalizza.

  17. Selezionare il metodo DeleteCustomers nell'elenco Personalizza.

  18. Eseguire il mapping dell'argomento di metodo Original_CustomerID alla proprietà di classe CustomerID (Original).

  19. Fare clic su OK.

Nota

Sebbene non sia un problema per questa procedura dettagliata specifica, vale la pena notare che LINQ to SQL gestisce automaticamente i valori generati dal database per identity (incremento automatico), rowguidcol (identificatore univoco globale generato dal database)e colonne timestamp durante gli inserimenti e gli aggiornamenti. I valori degli altri tipi di colonne sono costituiti da valori null non previsti. Per restituire i valori generati dal database, è necessario impostare IsDbGenerated manualmente su true e AutoSync su uno dei valori seguenti: AutoSync.Always, AutoSync.OnInsert o AutoSync.OnUpdate.

Testare l'applicazione

Eseguire nuovamente l'applicazione per verificare che la stored procedure UpdateCustomers aggiorni correttamente il record dei clienti nel database.

  1. Premere F5.

  2. Modificare un record nella griglia per testare il comportamento di aggiornamento.

  3. Aggiungere un nuovo record per testare il comportamento di inserimento.

  4. Fare clic sul pulsante Salva per salvare le modifiche nel database.

  5. Chiudere il modulo.

  6. Premere F5 e verificare che il record aggiornato e quello appena inserito siano stati salvati in modo permanente.

  7. Eliminare il nuovo record creato nel passaggio 3 per testare il comportamento di eliminazione.

  8. Fare clic sul pulsante Salva per inviare le modifiche e rimuovere il record eliminato dal database.

  9. Chiudere il modulo.

  10. Premere F5 e verificare che il record eliminato sia stato rimosso dal database.

    Nota

    Se l'applicazione usa SQL Server Express Edition, a seconda del valore della proprietà Copia nella directory di output del file di database, le modifiche potrebbero non essere visualizzate quando si preme F5 nel passaggio 10.

Passaggi successivi

A seconda dei requisiti dell'applicazione, è possibile eseguire diversi passaggi dopo la creazione di classi di entità LINQ to SQL. È possibile apportare alcuni miglioramenti a questa applicazione, tra cui: