Procedura dettagliata: creazione di classi LINQ to SQL (Progettazione relazionale oggetti)
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. Utilizzando LINQ to SQL [LINQ to SQL] è possibile accedere ai database SQL con tecnologia LINQ.Per ulteriori informazioni, vedere LINQ (Language-Integrated Query).
In questa procedura dettagliata vengono forniti i passaggi da seguire per creare classi di entità LINQ to SQL con mapping alle tabelle Customers e Orders del database Northwind e per visualizzare i dati in un Windows Form.Oltre ai passaggi per la visualizzazione dei dati della tabella, vengono forniti anche i passaggi per l'associazione dei dati a una query LINQ.Infine, vengono forniti i passaggi per l'utilizzo di stored procedure per sostituire la logica LINQ to SQL predefinita per l'invio degli aggiornamenti dalle classi di entità al database.
In questa procedura dettagliata viene illustrato come completare le seguenti attività:
Aggiunta di un file LINQ to SQL a un progetto.
Creazione di nuove classi di entità con mapping alle tabelle correlate nel database.
Creazione dell'origine dati di un oggetto che fa riferimento alla classe di entità.
Creazione di un Windows Form contenente controlli associati alle classi di entità.
Aggiunta di codice per caricare e salvare i dati tra le classi di entità e il database.
Costruzione di una query LINQ semplice e visualizzazione dei risultati nel form.
Aggiunta di stored procedure a O/R Designer.
Configurazione di una classe di entità 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:
Accesso alla versione SQL Server del database di esempio Northwind.Per ulteriori informazioni, vedere Procedura: installare database di esempio.
Stored procedure UpdateCustomer per il database Northwind.Per ulteriori informazioni, vedere Procedura dettagliata: creazione delle stored procedure di aggiornamento per la tabella Customers Northwind.
Creazione dell'applicazione basata su Windows
Poiché verranno utilizzate classi LINQ to SQL e verranno visualizzati i dati in un Windows Form, il primo passaggio di questa procedura dettagliata consiste nel creare una nuova applicazione Windows Form.
Per creare il nuovo progetto Applicazione Windows
Scegliere il comando per la creazione di un nuovo progetto dal menu File.
Assegnare al progetto il nome ORDesignerWalkthrough.
[!NOTA]
Poiché O/R Designer è supportato nei progetti di Visual Basic e di C#, creare il nuovo progetto in uno di questi linguaggi.
Fare clic sul modello Applicazione Windows Form, quindi scegliere OK.Per ulteriori informazioni, vedere Sviluppo di applicazioni client.
Il progetto ORDesignerWalkthrough viene creato e aggiunto a Esplora soluzioni.
Aggiunta di un file di classi LINQ to SQL al progetto (apertura di O/R Designer)
Le classi di entità vengono create e archiviate nei file di classi LINQ to SQL (file .dbml).Verrà visualizzato O/R Designer quando si apre un file .dbml. Aggiungere i file .dbml ai progetti selezionando il modello Classi LINQ to SQL nella finestra di dialogo Aggiungi nuovo elemento.
Per aggiungere un file .dbml a un progetto
Scegliere Aggiungi nuovo elemento dal menu Progetto.
Fare clic sul modello Classi LINQ to SQL e digitare Northwind.dbml nella casella Nome.
Scegliere Aggiungi.
Viene aggiunto al progetto un file di classi LINQ to SQL vuoto (Northwind.dbml) e viene aperto O/R Designer.
Dopo l'aggiunta del nuovo file LINQ to SQL al progetto, viene aperta l'area di progettazione vuota in cui vengono visualizzati due riquadri separati.Il riquadro a sinistra rappresenta il riquadro delle entità, in cui vengono visualizzate e configurate le classi di entità.Il riquadro a destra rappresenta il riquadro dei metodi, in cui vengono visualizzati i metodi DataContext aggiunti alla finestra di progettazione.Se il riquadro dei metodi non è visibile, fare clic con il pulsante destro del mouse su un'area vuota nel riquadro delle entità, quindi scegliere Mostra riquadro Metodi.L'intera area vuota rappresenta un oggetto DataContext pronto per la configurazione.Il nome di DataContext corrisponde al nome fornito per il file .dbml.Per questa procedura dettagliata, poiché il file LINQ to SQL è stato denominato Northwind.dbml, l'oggetto DataContext viene denominato NorthwindDataContext.È possibile verificare questa circostanza facendo clic su un'area vuota della finestra di progettazione e controllando la finestra Proprietà.
[!NOTA]
La classe DataContext contiene metodi e proprietà per la connessione a un database e la modifica dei dati presenti in esso (ad esempio, l'esecuzione dei comandi di inserimento, aggiornamento ed eliminazione).Per ulteriori informazioni, vedere Metodi DataContext (Progettazione relazionale oggetti).
Creazione di classi di entità Customer e Order
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 una classe di entità LINQ to SQL con mapping alla tabella nel database.
Per aggiungere una classe di entità Customer a O/R Designer
In Esplora server/Esplora database, individuare le tabelle nella versione SQL Server del database di esempio Northwind.Per ulteriori informazioni, vedere Procedura: creare una connessione dati al database Northwind.
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 pluralizzazionee 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).
Trascinare il nodo Orders da Esplora server/Esplora database nell'area di O/R Designer.
Viene creata una classe di entità denominata Order con un'associazione (relazione) Customer_Order alla classe di entità Customer.Tale classe presenta proprietà corrispondenti alle colonne della tabella Orders.
[!NOTA]
La classe di entità viene denominata Order poiché rappresenta un solo ordine.La classe padre (Customer) presenta una proprietà Orders che rappresenta la raccolta di ordini per questo specifico cliente.Per ulteriori informazioni sulle associazioni LINQ to SQL, vedere Procedura: creare un'associazione (relazione) tra classi LINQ to SQL (Progettazione relazionale oggetti).
Creazione dell'origine dati di un oggetto con la classe di entità Customer
Le classi di entità, analogamente alle altre classi che dispongono di proprietà pubbliche, possono essere utilizzate come origini dati di un oggetto.Possono inoltre essere aggiunte alla finestra Origini dati ed essere trascinate nei form per creare controlli associati a dati (ovvero, controlli associati ai valori delle proprietà pubbliche dell'oggetto).Aggiungere le classi di entità alla finestra Origini dati eseguendo la Configurazione guidata origine dati e facendo clic su Oggetto per l'origine dati nella procedura guidata.
Per aggiungere Customer come origine dati di un oggetto nella finestra Origini dati
Scegliere Compila ORDesignerWalkthrough dal menu Compila per compilare il progetto.
Scegliere Mostra origini dati dal menu Dati.
Nella finestra Origini dati fare clic su Aggiungi nuova origine dati.
Nella pagina Seleziona un tipo di origine dati fare clic su Oggetto, quindi su Avanti.
Espandere il nodo ORDesignerWalkthrough, ovvero il nodo con il nome del progetto, 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.
Fare clic su Fine per creare l'origine dati e aggiungere la classe di entità Customer alla finestra Origini dati.
Creazione di controlli associati a dati per visualizzare i dati 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à
Aprire Form1 nella visualizzazione Progettazione.
Trascinare il nodo Customer dalla finestra Origini dati in Form1.
[!NOTA]
Per visualizzare la finestra Origini dati, scegliere Mostra origini dati dal menu Dati.
Trascinare il nodo Orders dalla finestra Origini dati in Form1e posizionarlo in CustomerDataGridView.
Aprire Form1 nella visualizzazione Codice.
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();
Creare un gestore eventi per l'evento Form_Load e aggiungere il seguente codice al gestore:
CustomerBindingSource.DataSource = NorthwindDataContext1.Customers
customerBindingSource.DataSource = northwindDataContext1.Customers;
Test dell'applicazione
Eseguire l'applicazione.A questo punto il form contiene un oggetto DataGridView in cui vengono visualizzati i dati della tabella Customers e un secondo oggetto DataGridView in cui vengono visualizzati i dati degli ordini di un cliente selezionato.
[!NOTA]
Il pulsante Salva è disabilitato,(la funzionalità di salvataggio verrà implementata nella sezione successiva).
Per eseguire il test dell'applicazione
Premere F5.
Verificare che i dati vengano visualizzati nelle griglie.
Selezionare un cliente.
Verificare che gli ordini visualizzati siano relativi al cliente selezionato.
Chiudere il form.Scegliere Termina debug dal menu Debug.
Implementazione della funzionalità di salvataggio
Come osservato in precedenza, 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 form.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
Aprire Form1 nella visualizzazione Progettazione.
Selezionare il pulsante Salva in CustomerBindingNavigator(il pulsante contrassegnato con l'icona di un 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 del codice.
Aggiungere il seguente codice nel gestore eventi del pulsante Salva:
Try NorthwindDataContext1.SubmitChanges() Catch ex As Exception MessageBox.Show(ex.Message) End Try
try { northwindDataContext1.SubmitChanges(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
Test dell'applicazione
Eseguire l'applicazione.Per poter salvare i dati, è necessario che il pulsante Salva sia abilitato.
Per eseguire il test dell'applicazione
Premere F5.
Modificare alcuni dati in una delle griglie(spostarsi dalla riga modificata nella griglia per eseguire il commit delle modifiche in corso).
Fare clic sul pulsante Salva per salvare le modifiche nel database.
Chiudere il form.
Premere F5 e verificare che le modifiche siano state salvate in modo permanente oppure individuare la tabella nel database per verificare il salvataggio delle modifiche.
Associazione a query LINQ
Oltre ad associare CustomerBindingSource all'oggetto DataContext, è anche possibile effettuare l'associazione diretta a query LINQ.Per ulteriori informazioni sulla creazione di query LINQ, vedere Introduzione alle query LINQ (C#).
Aggiunta di un controllo Button e TextBox al form
Per informazioni sull'associazione di controlli a query LINQ, aggiungere al form controlli che consentano di immettere un parametro di query ed eseguire la query.
Per aggiungere controlli al form
Aprire Form1 nella visualizzazione Progettazione.
Aggiungere un controllo TextBox al form e impostarne la proprietà Name su CityTextBox.
Aggiungere un controllo Button al form e impostare le seguenti proprietà:
Name = RunQueryButton
Text = Run Query
Associazione dati alla query LINQ
Aggiungere codice per eseguire una query LINQ.Tale query utilizza il valore digitato in CityTextBox come parametro di query.
Per eseguire l'associazione a una query LINQ
Fare doppio clic su RunQueryButton e aggiungere il seguente codice al gestore dell'evento RunQueryButton_click:
Dim CustomersQuery = From customers in NorthwindDataContext1.Customers _ Where customers.City = CityTextBox.Text _ Select customers CustomerBindingSource.DataSource = CustomersQuery
var CustomersQuery = from customers in northwindDataContext1.Customers where customers.City == CityTextBox.Text select customers; customerBindingSource.DataSource = CustomersQuery;
Test dell'applicazione
Eseguire l'applicazione.A questo punto è possibile eseguire una query per i clienti che si trovano in una specifica città.
Per eseguire il test dell'applicazione
Premere F5.
Digitare London nella casella di testo.
Fare clic sul pulsante Esegui query.
Verificare che vengano visualizzati solo i clienti la cui proprietà City presenti il valore London.
Override del comportamento predefinito per l'esecuzione degli aggiornamenti (comandi di inserimento, aggiornamento ed eliminazione)
Per impostazione predefinita, la logica per eseguire aggiornamenti viene fornita dal runtime LINQ to SQL. Nel runtime vengono create istruzioni Insert, Update e Delete predefinite in base all'istruzione Select, utilizzata per popolare la classe di entità con dati.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 la modifica 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à a tabelle con join.Inoltre, è possibile eseguire l'override del comportamento di aggiornamento predefinito quando il database richiede l'accesso alla tabella tramite stored procedure.
[!NOTA]
In questa sezione è richiesta la disponibilità delle stored procedure aggiuntive 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.
Per eseguire l'override del comportamento di aggiornamento predefinito
Aprire il file LINQ to SQL in O/R Designer. (Fare doppio clic sul file Northwind.dbml in Esplora soluzioni).
In Esplora server/Esplora database espandere il nodo Stored procedure dei database Northwind e individuare la stored procedure UpdateCustomers.
Trascinare la stored procedure UpdateCustomers in O/R Designer.
La stored procedure UpdateCustomers viene aggiunta al riquadro dei metodi come metodo DataContext.Per ulteriori informazioni, vedere Metodi DataContext (Progettazione relazionale oggetti).
Selezionare la classe di entità Customer in O/R Designer.
Nella finestra Proprietà selezionare il comando di cui eseguire l'override(Insert, Update o Delete).Per questo esempio selezionare la proprietà Update.
Fare clic sui puntini di sospensione accanto a Usa fase di esecuzione per aprire la finestra di dialogo Configura comportamento.
Selezionare Personalizza.
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.
Eseguire il mapping degli argomenti di metodo originali (Original_ArgumentName) alle proprietà originali (PropertyName (Original)).Per questa procedura dettagliata è necessario eseguire il mapping dell'argomento Original_CustomerID alla proprietà 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à sono stati 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 la finestra di progettazione 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).
Scegliere OK.
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
Premere F5.
Individuare la colonna ContactName nella griglia relativa ad ALFKI.
Modificare il nome Maria Anders in Anders.
Spostarsi dalla riga per eseguire il commit della modifica.
Fare clic sul pulsante Salva.
Chiudere il form.
Premere F5 per eseguire nuovamente l'applicazione e verificare che venga visualizzato solo Anders nella colonna ContactName relativa ad ALFKI.
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:
Aggiunta di altre stored procedure da utilizzare per i comandi Insert e Delete.Per ulteriori informazioni, vedere Procedura: assegnare stored procedure per l'esecuzione dei comandi di aggiornamento, inserimento ed eliminazione (Progettazione relazionale oggetti).
Costruzione di varie query LINQ per la restituzione di dati filtrati.Per ulteriori informazioni, vedere Procedura: eseguire query per ottenere informazioni.
Vedere anche
Concetti
Cenni preliminari su Progettazione relazionale oggetti
Novità per lo sviluppo di applicazioni dati in Visual Studio 2012
Altre risorse
Progettazione relazionale oggetti
LINQ General Programming Guide
LINQ Documentation Roadmap