Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
La DataSet classe 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 app vengono disconnesse dal database. Le tecnologie sono particolarmente utili per le app che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Sebbene i set di dati siano una tecnologia di successo comprovata, l'approccio consigliato per le nuove applicazioni .NET consiste nell'usare Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e dispone di 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).For more information, see LINQ (Language Integrated Query).
Per impostazione predefinita, la logica per eseguire gli aggiornamenti viene fornita dal runtime LINQ to SQL. Il runtime crea istruzioni Insert, Update e Delete predefinite in base allo schema della tabella (le definizioni di colonna e le informazioni sulla chiave primaria). Quando non si desidera utilizzare il comportamento predefinito, è possibile configurare il comportamento di aggiornamento e designare stored procedure specifiche per eseguire gli inserimenti, gli aggiornamenti e le eliminazioni necessari per lavorare con i dati nel database. È anche possibile eseguire questa operazione quando il comportamento predefinito non viene generato, ad esempio quando le classi di entità eseguono il mapping alle visualizzazioni. Inoltre, è possibile eseguire l'override del comportamento di aggiornamento predefinito quando il database richiede l'accesso alle tabelle tramite stored procedure. Per altre informazioni, vedere Personalizzazione delle operazioni tramite stored procedure.
Annotazioni
Questa procedura dettagliata richiede 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 Forms e aggiungervi un file LINQ to SQL.
Creare una classe di entità mappata alla tabella Northwind
Customers.Definire un'origine dati oggetto che fa riferimento alla classe LINQ to SQL
Customer.Creare un Windows Form contenente un DataGridView oggetto associato alla
Customerclasse .Implementare la funzionalità di salvataggio per il modulo.
Creare DataContext metodi aggiungendo stored procedure alla finestra di progettazione O/R.
Configurare la classe
Customerper utilizzare stored procedure per eseguire inserimenti, aggiornamenti ed eliminazioni.
Prerequisiti
Questa procedura dettagliata usa SQL Server Express LocalDB e il database di esempio Northwind.
Se SQL Server Express LocalDB non è disponibile, installarlo dalla pagina di download di SQL Server Express o tramite il programma di installazione di Visual Studio. Nel programma di installazione di Visual Studioè possibile installare SQL Server Express LocalDB come parte del carico di lavoro di archiviazione ed elaborazione dei dati o come singolo componente.
Installare il database di esempio Northwind seguendo questa procedura:
In Visual Studio, aprire la finestra Esplora oggetti di SQL Server. SQL Server Object Explorer viene installato come parte del workload Archiviazione dati ed elaborazione nel Visual Studio Installer. Espandi il nodo SQL Server. Fare clic con il pulsante destro del mouse sull'istanza di LocalDB e selezionare Nuova query.
Verrà visualizzata una finestra dell'editor di query.
Copia lo script Northwind Transact-SQL negli Appunti. Questo script T-SQL crea il database Northwind da zero e lo popola con i dati.
Incolla lo script T-SQL nell'editor di query e poi scegli 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.
Annotazioni
Le istruzioni in questo articolo illustrano la versione più recente dell'esperienza di sviluppo interattiva (IDE) disponibile in Visual Studio. Il computer potrebbe visualizzare nomi o posizioni diversi per alcuni elementi dell'interfaccia utente. È possibile usare una versione diversa di Visual Studio o impostazioni di ambiente diverse. Per altre informazioni, vedere Personalizzare l'IDE.
Per creare un nuovo progetto di applicazione Windows Form che contiene classi LINQ to SQL
In Visual Studio scegliere Nuovo> dal menu File.
Espandere Visual C# o Visual Basic nel riquadro a sinistra, quindi selezionare Desktop di Windows.
Nel riquadro centrale selezionare il tipo di progetto App Windows Form .
Assegnare al progetto il nome UpdatingWithSProcsWalkthrough e quindi scegliere OK.
Il progetto UpdatingWithSProcsWalkthrough viene creato e aggiunto a Esplora soluzioni.
Nel menu Progetto , fare clic su Aggiungi Nuovo Elemento.
Clicca sul modello LINQ to SQL Classi e digita Northwind.dbml nella casella Nome.
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 la fonte 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 sono classi di entità di LINQ to SQL che eseguono il mapping alle tabelle nel database. Dopo aver creato le classi di entità, possono essere usate come origini dati oggetto esattamente come altre classi con proprietà pubbliche.
Per creare una classe di entità Customer e configurare un'origine dati tramite essa
In Esplora server o Esplora database individuare la tabella Customer nella versione di SQL Server del database di esempio Northwind.
Trascinare il nodo Customers da Esplora server o Esplora database nell'area *O/R Designer .
Viene creata una classe di entità denominata Customer . Dispone di proprietà che corrispondono alle colonne della tabella Customers. La classe di entità è denominata Customer (non Customers) perché rappresenta un singolo cliente dalla tabella Customers.
Annotazioni
Questo comportamento di ridenominazione è denominato pluralizzazione. Può essere attivato o disattivato nella finestra di dialogo Opzioni. Per altre informazioni, vedere Procedura: Attivare e disattivare la pluralizzazione (Progettazione O/R).
Scegliere Build UpdatingwithSProcsWalkthrough dal menu Compila per compilare il progetto.
Per aprire la finestra Origini dati, scegliere Mostra origini dati dal menu Dati.
Nella finestra Origini Dati, fare clic su Aggiungi Nuova Origine Dati.
Fare clic su Oggetto nella pagina Scegliere un tipo di origine dati e quindi selezionare Avanti.
Espandere il nodo UpdatingwithSProcsWalkthrough e individuare e selezionare la classe Customer .
Annotazioni
Se la classe Customer non è disponibile, annullare la procedura guidata, compilare il progetto ed eseguire nuovamente la procedura guidata.
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à
Apri Form1 nella visualizzazione Struttura.
Dalla finestra Origini dati trascinare il nodo Customer in Form1.
Annotazioni
Per visualizzare la finestra Origini dati , scegliere Mostra origini dati dal menu Dati .
Aprire Form1 nell'editor di codice.
Aggiungere il codice seguente al modulo, a livello globale per il modulo, all'esterno di un metodo specifico, ma all'interno della classe
Form1.Creare un gestore eventi per l'evento
Form_Loade aggiungere il codice seguente al gestore:
Implementare la funzionalità di salvataggio
Per impostazione predefinita, il pulsante salva non è abilitato e la funzionalità di salvataggio non è implementata. Inoltre, il codice non viene aggiunto automaticamente per salvare i dati modificati nel database quando vengono creati controlli associati a dati per le origini dati oggetto. 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
Apri Form1 nella visualizzazione Struttura.
Selezionare il pulsante Salva in CustomerBindingNavigator (il pulsante con l'icona del disco floppy).
Nella finestra Proprietà impostare la proprietà Enabled su True.
Fare doppio clic sul pulsante Salva per creare un gestore eventi e passare all'editor di codice.
Aggiungere il codice seguente nel gestore eventi del pulsante salva:
Eseguire l'override del comportamento predefinito per l'esecuzione di aggiornamenti (inserimenti, aggiornamenti ed eliminazioni)
Per eseguire l'override del comportamento di aggiornamento predefinito
Aprire il file LINQ to SQL in Progettazione O/R. Fare doppio clic sul file Northwind.dbml in Esplora soluzioni.
In Esplora server o Esplora database, espandi il nodo Stored Procedures del database Northwind e individua le Stored Procedures InsertCustomers, UpdateCustomers e DeleteCustomers.
Trascinare tutte e tre le stored procedure nel Designer O/R.
Le procedure memorizzate vengono aggiunte al riquadro dei metodi come metodi di tipo DataContext. Per ulteriori informazioni, vedere i metodi DataContext (O/R Designer) .
Selezionare la classe di entità Customer nel Progettista O/R.
Nella finestra Proprietà selezionare la proprietà Inserisci .
Fare clic sui puntini di sospensione (...) accanto a Usa runtime per aprire la finestra di dialogo Configura comportamento .
Seleziona Personalizza.
Selezionare il metodo InsertCustomers nell'elenco Personalizza .
Fare clic su Applica per salvare la configurazione per la classe e il comportamento selezionati.
Annotazioni
È possibile continuare a configurare il comportamento per ogni combinazione di classe/comportamento, purché si faccia clic su Applica dopo aver apportato ogni modifica. 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.
Selezionare Aggiorna nell'elenco Comportamento .
Seleziona Personalizza.
Selezionare il metodo UpdateCustomers nell'elenco Personalizza .
Esaminare l'elenco degli argomenti del metodo e delle proprietà della classe e notare che sono presenti due argomenti del metodo e due proprietà di classe per alcune colonne della tabella. In questo modo è più semplice tenere traccia delle modifiche e creare statement per controllare la presenza di violazioni della concorrenza.
Eseguire il mapping dell'argomento del metodo Original_CustomerID alla proprietà della classe CustomerID (Original).
Annotazioni
Per impostazione predefinita, gli argomenti del metodo verranno mappati alle proprietà della classe quando i nomi corrispondono. Se i nomi delle proprietà vengono modificati e non corrispondono più tra la tabella e la classe di entità, potrebbe essere necessario selezionare la proprietà di classe equivalente a cui eseguire il mapping se Progettazione O/R non è in grado di determinare il mapping corretto. Inoltre, se gli argomenti del metodo non dispongono di proprietà di classe valide a cui eseguire il mapping, è possibile impostare il valore Proprietà classe su (Nessuno).
Fare clic su Applica per salvare la configurazione per la classe e il comportamento selezionati.
Selezionare Elimina nell'elenco Comportamento .
Seleziona Personalizza.
Selezionare il metodo DeleteCustomers nell'elenco Personalizza .
Eseguire il mapping dell'argomento del metodo Original_CustomerID alla proprietà della classe CustomerID (Original).
Fare clic su OK.
Annotazioni
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 generati dal database in altri tipi di colonna genereranno in modo imprevisto un valore Null. 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 di nuovo l'applicazione per verificare che la stored procedure UpdateCustomers aggiorni correttamente il record del cliente nel database.
Premere F5.
Modificare un record nella griglia per testare il comportamento di aggiornamento.
Aggiungere un nuovo record per testare il comportamento di inserimento.
Fare clic sul pulsante Salva per salvare di nuovo le modifiche nel database.
Chiudere il modulo.
Premere F5 e verificare che il record aggiornato e il record appena inserito siano persistenti.
Eliminare il nuovo record creato nel passaggio 3 per testare il comportamento di eliminazione.
Fare clic sul pulsante Salva per inviare le modifiche e rimuovere il record eliminato dal database.
Chiudere il modulo.
Premere F5 e verificare che il record eliminato sia stato rimosso dal database.
Annotazioni
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. Alcuni miglioramenti che è possibile apportare a questa applicazione includono quanto segue:
Implementare il controllo della concorrenza durante gli aggiornamenti. Per informazioni, vedere Concorrenza ottimistica: panoramica.
Aggiungere query LINQ per filtrare i dati. Per informazioni, vedere Introduzione alle query LINQ (C#).