Share via


Procedura dettagliata: personalizzazione del comportamento di Insert, Update e Delete delle classi di entità

In Progettazione relazionale oggetti è disponibile un'area di progettazione visiva per la creazione e la modifica di classi LINQ to SQL (classi di entità) basate sugli oggetti in un database. Mediante LINQ to SQL, è possibile utilizzare la tecnologia LINQ per accedere ai database SQL. Per ulteriori informazioni, vedere LINQ (Language-Integrated Query).

Per impostazione predefinita, la logica per eseguire gli aggiornamenti viene fornita dal runtime LINQ to SQL. Nel runtime vengono create istruzioni Insert, Update e Delete predefinite in base allo schema della tabella (definizioni di colonna e informazioni sulla chiave primaria). Quando non si desidera utilizzare 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'utilizzo 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 ulteriori informazioni, vedere Personalizzazione delle operazioni tramite l'utilizzo di stored procedure (LINQ to SQL).

Nota

In questa procedura dettagliata è richiesta la disponibilità delle stored procedure InsertCustomer, UpdateCustomer e DeleteCustomer per il database Northwind. Per informazioni dettagliate sulla creazione di queste stored procedure, vedere Procedura dettagliata: creazione delle stored procedure di aggiornamento per la tabella Customers Northwind.

In questa procedura dettagliata vengono forniti i passaggi da completare per eseguire l'override del comportamento in fase di esecuzione LINQ to SQL predefinito per salvare i dati in un database utilizzando stored procedure.

In questa procedura dettagliata viene illustrato come completare le seguenti attività:

  • Creazione di una nuova applicazione Windows Form e aggiunta ad essa di un file LINQ to SQL.

  • Creazione di una classe di entità con mapping alla tabella Customers di Northwind.

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

  • Creazione di un Windows Form che contiene un oggetto DataGridView associato alla classe Customer.

  • Implementazione della funzionalità di salvataggio per il form.

  • Creazione di metodi DataContext mediante l'aggiunta di stored procedure a O/R Designer.

  • Configurazione della classe Customer in modo che utilizzi stored procedure per l'esecuzione dei comandi di inserimento, aggiornamento ed eliminazione.

Prerequisiti

Per completare questa procedura dettagliata, è necessario disporre dei seguenti elementi:

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

Poiché verranno utilizzate classi LINQ to SQL e verranno visualizzati i dati in un Windows Form, creare una nuova applicazione Windows Form e aggiungere un file di classi LINQ to SQL.

Nota

Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.

Per creare un nuovo progetto Applicazione Windows che contenga classi LINQ to SQL

  1. Scegliere il comando per la creazione di un nuovo progetto dal menu File.

  2. Assegnare al progetto il nome UpdatingwithSProcsWalkthrough.

    Nota

    O/R Designer è supportato nei progetti di Visual Basic e di C#. Pertanto, creare il nuovo progetto in uno di questi linguaggi.

  3. Fare clic sul modello Applicazione Windows Form, quindi scegliere OK. Per ulteriori informazioni, vedere Creazione di applicazioni per Windows.

    Il progetto UpdatingwithSProcsWalkthrough viene creato e aggiunto a Esplora soluzioni.

  4. Scegliere Aggiungi nuovo elemento dal menu Progetto.

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

  6. Scegliere Aggiungi.

    Viene aggiunto al progetto un file di classi LINQ to SQL vuoto (Northwind.dbml) e viene aperto O/R Designer.

Creazione della classe di entità Customer e dell'origine dati di un oggetto

Creare classi LINQ to SQL con mapping alle tabelle di database trascinando le tabelle da Esplora server/Esplora database in O/R Designer. Il risultato è rappresentato da classi di entità LINQ to SQL con mapping alle tabelle nel database. Dopo aver creato le classi di entità, è possibile utilizzarle 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/Esplora database, individuare la tabella Customer nella versione SQL Server del database di esempio Northwind. Per ulteriori informazioni, vedere Procedura: creare una connessione dati al database Northwind.

  2. Trascinare il nodo Customers da Esplora server/Esplora database nell'area di 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 e può essere attivato o disattivato nella Finestra di dialogo Opzioni (Visual Studio). Per ulteriori informazioni, vedere Procedura: attivare e disattivare la pluralizzazione (Progettazione relazionale oggetti).

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

  4. 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, quindi su Avanti.

  7. Espandere il nodo UpdatingwithSProcsWalkthrough, 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.

Creazione di un controllo DataGridView per visualizzare i dati dei clienti in un Windows Form

Creare controlli associati alle classi di entità trascinando gli elementi delle origini 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 al form il seguente codice, che verrà applicato all'intero form, all'esterno di un metodo specifico ma all'interno della classe Form1:

    Private NorthwindDataContext1 As New NorthwindDataContext
    
    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
    
    customerBindingSource.DataSource
        = northwindDataContext1.Customers;
    

Implementazione della 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. In questa sezione viene illustrato 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()
    
    northwindDataContext1.SubmitChanges();
    

Override del comportamento predefinito per l'esecuzione degli aggiornamenti (comandi di inserimento, aggiornamento ed eliminazione)

Per eseguire l'override del comportamento di aggiornamento predefinito

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

  2. In Esplora server/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 O/R Designer.

    Le stored procedure vengono aggiunte al riquadro dei metodi come metodi DataContext. Per ulteriori informazioni, vedere Metodi DataContext (Progettazione relazionale oggetti).

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

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

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

  7. Selezionare 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, verrà visualizzata una finestra di dialogo di avviso che offre la possibilità di applicare le eventuali modifiche apportate.

  10. Selezionare Aggiorna nell'elenco Comportamento.

  11. Selezionare 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 a cui eseguire il mapping nel caso in cui Progettazione relazionale oggetti non sia in grado di determinare il mapping corretto. Inoltre, se per gli argomenti di metodo non sono disponibili proprietà di classe valide a cui eseguire 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. Selezionare 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. Scegliere OK.

Nota

Sebbene non sia un problema per questa procedura dettagliata, è opportuno notare che LINQ to SQL gestisce i valori generati dal database automaticamente per le colonne identity (incremento automatico), rowguidcol (GUID generato dal database) e timestamp durante le operazioni di inserimento e aggiornamento. I valori degli altri tipi di colonne sono costituiti da valori null non previsti. Per restituire i valori generati dal database, è necessario impostare manualmente IsDbGenerated su true e AutoSync su uno dei seguenti valori: Always, OnInsertOnUpdate.

Test dell'applicazione

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

Per eseguire il test dell'applicazione

  1. Premere F5.

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

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

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

  5. Chiudere il form.

  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 Delete.

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

  9. Chiudere il form.

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

    Nota

    Se l'applicazione utilizza SQL Server Express Edition, a seconda del valore della proprietà Copia nella directory di output del file di database, è possibile che le modifiche non vengano visualizzate quando si preme F5 nel passaggio 10. Per ulteriori informazioni, vedere Procedura: gestire file di dati locali nel progetto.

Passaggi successivi

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

Vedere anche

Attività

Procedura: assegnare stored procedure per l'esecuzione dei comandi di aggiornamento, inserimento ed eliminazione (Progettazione relazionale oggetti)

Concetti

Query LINQ to SQL

Metodi DataContext (Progettazione relazionale oggetti)

Novità dello sviluppo di applicazioni di dati

Altre risorse

Progettazione relazionale oggetti

LINQ to SQL