Aggiornamento gerarchico nello sviluppo di .NET Framework

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.

L'aggiornamento gerarchico si riferisce al processo di salvataggio dei dati aggiornati (da un set di dati con due o più tabelle correlate) a un database mantenendo al tempo stesso regole di integrità referenziale. L'integrità referenziale si riferisce alle regole di coerenza fornite dai vincoli in un database che controllano il comportamento di inserimento, aggiornamento ed eliminazione di record correlati. Ad esempio, è integrità referenziale che impone la creazione di un record cliente prima di consentire la creazione degli ordini per il cliente. Per altre informazioni sulle relazioni nei set di dati, vedere Relazioni nei set di dati.

La funzionalità di aggiornamento gerarchico usa un TableAdapterManager oggetto per gestire gli TableAdapteroggetti in un set di dati tipizzato. Il TableAdapterManager componente è una classe generata da Visual Studio, non un tipo .NET. Quando si trascina una tabella dalla finestra Origini dati a una pagina Windows Form o WPF, Visual Studio aggiunge una variabile di tipo TableAdapterManager alla maschera o alla pagina e viene visualizzata nella finestra di progettazione nella barra dei componenti. Per informazioni dettagliate sulla TableAdapterManager classe, vedere la sezione TableAdapterManager Reference (Riferimento tableAdapterManager) di TableAdapters.

Per impostazione predefinita, un set di dati considera le tabelle correlate come "solo relazioni", il che significa che non applica vincoli di chiave esterna. È possibile modificare tale impostazione in fase di progettazione usando Progettazione set di dati. Selezionare la linea di relazione tra due tabelle per visualizzare la finestra di dialogo Relazione . Le modifiche apportate qui determineranno il comportamento dell'oggetto TableAdapterManager quando invierà le modifiche nelle tabelle correlate al database.

Abilitare l'aggiornamento gerarchico in un set di dati

Per impostazione predefinita, l'aggiornamento gerarchico è abilitato per tutti i nuovi set di dati aggiunti o creati in un progetto. Attivare o disattivare l'aggiornamento gerarchico impostando la proprietà Aggiornamento gerarchico di un set di dati tipizzato nel set di dati su True o False:

Impostazione di aggiornamento gerarchico

Creare una nuova relazione tra tabelle

Per creare una nuova relazione tra due tabelle, in Progettazione set di dati selezionare la barra del titolo di ogni tabella, quindi fare clic con il pulsante destro del mouse e selezionare Aggiungi relazione.

Menu Aggiungi relazione di aggiornamento gerarchico

Comprendere i vincoli di chiave esterna, gli aggiornamenti a catena e le eliminazioni

È importante comprendere come vengono creati i vincoli di chiave esterna e il comportamento a catena nel database nel codice del set di dati generato.

Per impostazione predefinita, le tabelle dati in un set di dati vengono generate con relazioni (DataRelation) che corrispondono alle relazioni nel database. Tuttavia, la relazione nel set di dati non viene generata come vincolo di chiave esterna. l'oggetto DataRelation è configurato come Solo relazione senza UpdateRule o DeleteRule in effetti.

Per impostazione predefinita, gli aggiornamenti a catena e le eliminazioni a catena vengono disattivati anche se la relazione di database è impostata con aggiornamenti a catena o eliminazioni a catena attivate. Ad esempio, la creazione di un nuovo cliente e un nuovo ordine e il tentativo di salvare i dati possono causare un conflitto con i vincoli di chiave esterna definiti nel database. Per altre informazioni, vedere Disattivare i vincoli durante il riempimento di un set di dati.

Impostare l'ordine per eseguire gli aggiornamenti

L'impostazione dell'ordine per eseguire gli aggiornamenti imposta l'ordine dei singoli inserimenti, aggiornamenti ed eliminazioni necessari per salvare tutti i dati modificati in tutte le tabelle di un set di dati. Quando l'aggiornamento gerarchico è abilitato, gli inserimenti vengono eseguiti per primi, quindi vengono aggiornati e quindi eliminati. fornisce TableAdapterManager una UpdateOrder proprietà che può essere impostata per eseguire prima gli aggiornamenti, quindi inserisce e quindi elimina.

Nota

È importante comprendere che l'ordine di aggiornamento è tutto inclusivo. Ovvero, quando vengono eseguiti gli aggiornamenti, gli inserimenti e le eliminazioni vengono eseguiti per tutte le tabelle nel set di dati.

Per impostare la UpdateOrder proprietà, dopo aver trascinato gli elementi dalla finestra Origini dati in una maschera, selezionare nella TableAdapterManager barra dei componenti e quindi impostare la UpdateOrder proprietà nella finestra Proprietà .

Creare una copia di backup di un set di dati prima di eseguire un aggiornamento gerarchico

Quando si salvano dati (chiamando il TableAdapterManager.UpdateAll() metodo ), il TableAdapterManager tentativo di aggiornare i dati per ogni tabella in una singola transazione. Se una parte dell'aggiornamento per qualsiasi tabella ha esito negativo, viene eseguito il rollback dell'intera transazione. Nella maggior parte dei casi, il rollback restituisce l'applicazione allo stato originale.

Tuttavia, a volte potrebbe essere necessario ripristinare il set di dati dalla copia di backup. Un esempio di questo problema può verificarsi quando si usano valori di incremento automatico. Ad esempio, se un'operazione di salvataggio non riesce, i valori di incremento automatico non vengono reimpostati nel set di dati e il set di dati continua a creare valori con incremento automatico. Ciò lascia un vuoto nella numerazione che potrebbe non essere accettabile nell'applicazione. In situazioni in cui si tratta di un problema, fornisce TableAdapterManager una BackupDataSetBeforeUpdate proprietà che sostituisce il set di dati esistente con una copia di backup se la transazione non riesce.

Nota

La copia di backup è in memoria solo mentre il TableAdapterManager.UpdateAll metodo è in esecuzione. Di conseguenza, non esiste alcun accesso a livello di codice a questo set di dati di backup perché sostituisce il set di dati originale o esce dall'ambito non appena il metodo termina l'esecuzione TableAdapterManager.UpdateAll .

Modificare il codice di salvataggio generato per eseguire l'aggiornamento gerarchico

Salvare le modifiche dalle tabelle dati correlate del set di dati nel database chiamando il metodo TableAdapterManager.UpdateAll e passando il nome del set di dati contenente le tabelle correlate. Ad esempio, eseguire il metodo TableAdapterManager.UpdateAll(NorthwindDataset) per inviare gli aggiornamenti da tutte le tabelle presenti in NorthwindDataSet al database back-end.

Dopo avere rilasciato gli elementi dalla finestra Origini dati, il codice viene automaticamente aggiunto all'evento Form_Load per popolare ogni tabella (metodi TableAdapter.Fill). Il codice viene anche aggiunto all'evento Click del pulsante Salva di BindingNavigator per salvare i dati dal set di dati nel database (metodo TableAdapterManager.UpdateAll).

Il codice di salvataggio generato contiene anche una riga di codice che chiama il metodo CustomersBindingSource.EndEdit. In particolare, chiama il EndEdit metodo del primo BindingSourceoggetto aggiunto al form. In altre parole, questo codice viene generato solo per la prima tabella trascinata dalla finestra Origini dati nel form. La chiamata al metodo EndEdit esegue il commit di tutte le modifiche in corso nei controlli associati a dati che si stanno modificando. Pertanto, se un controllo associato a dati ha lo stato attivo e si fa clic sul pulsante Salva, prima del salvataggio effettivo verrà eseguito il commit di tutte le modifiche in sospeso nel controllo (metodo TableAdapterManager.UpdateAll).

Nota

Progettazione set di dati aggiunge solo il BindingSource.EndEdit codice per la prima tabella eliminata nel form. Pertanto, è necessario aggiungere una riga di codice per chiamare il metodo BindingSource.EndEdit per ogni tabella correlata nel form. Per questa procedura dettagliata, è necessario quindi aggiungere una chiamata al metodo OrdersBindingSource.EndEdit.

  1. Fare doppio clic sul pulsante Salva in BindingNavigator per aprire Form1 nell'editor del codice.

  2. Aggiungere una riga di codice per chiamare il metodo OrdersBindingSource.EndEdit dopo la riga che chiama il metodo CustomersBindingSource.EndEdit. Il codice nell'evento Click del pulsante Salva deve essere simile al seguente:

    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Oltre a eseguire il commit delle modifiche apportate a una tabella figlio correlata prima di salvare i dati in un database, potrebbe anche essere necessario eseguire il commit dei record padre appena creati prima di aggiungere i nuovi record figlio in un set di dati. In altre parole, potrebbe essere necessario aggiungere il nuovo record padre (Customer) al set di dati prima che i vincoli di chiave esterna consentano l'aggiunta di nuovi record figlio (Orders) al set di dati. A tale scopo, è possibile usare l'evento figlio BindingSource.AddingNew.

Nota

L'eventuale commit di nuovi record padre dipende dal tipo di controllo usato per l'associazione all'origine dati. In questa procedura dettagliata si usano singoli controlli per eseguire l'associazione alla tabella padre. Ciò richiede il codice aggiuntivo per eseguire il commit del nuovo record padre. Se i record padre venivano invece visualizzati in un controllo di associazione complesso come , DataGridViewquesta chiamata aggiuntiva EndEdit per il record padre non sarebbe necessaria. perché la funzionalità di data-binding sottostante del controllo gestisce l'esecuzione del commit dei nuovi record.

Per aggiungere il codice per eseguire il commit dei record padre nel set di dati prima dell'aggiunta dei nuovi record figlio

  1. Creare un gestore eventi per l'evento OrdersBindingSource.AddingNew.

    • Aprire Form1 nella visualizzazione struttura, selezionare OrdersBindingSource nella barra dei componenti, selezionare Eventi nella finestra Proprietà e quindi fare doppio clic sull'evento AddingNew .
  2. Aggiungere una riga di codice al gestore eventi che chiama il CustomersBindingSource.EndEdit metodo . Il codice nel gestore eventi OrdersBindingSource_AddingNew deve essere simile al seguente:

    this.customersBindingSource.EndEdit();
    

Informazioni di riferimento su TableAdapterManager

Per impostazione predefinita, viene generata una TableAdapterManager classe quando si crea un set di dati contenente tabelle correlate. Per impedire la generazione della classe, modificare il valore della Hierarchical Update proprietà del set di dati su false. Quando si trascina una tabella con una relazione nell'area di progettazione di una pagina Windows Form o WPF, Visual Studio dichiara una variabile membro della classe . Se non si usa databinding, è necessario dichiarare manualmente la variabile.

La TableAdapterManager classe non è un tipo .NET. Pertanto, non è possibile cercarlo nella documentazione. Viene creato in fase di progettazione come parte del processo di creazione del set di dati.

Di seguito sono riportati i metodi e le proprietà usati di frequente della TableAdapterManager classe :

Membro Descrizione
Metodo UpdateAll Salva tutti i dati da tutte le tabelle dati.
Proprietà BackUpDataSetBeforeUpdate Determina se creare una copia di backup del set di dati prima di eseguire il TableAdapterManager.UpdateAll metodo . Boolean.
tableNameTableAdapter - proprietà Rappresenta un oggetto TableAdapter. L'oggetto generato contiene una proprietà per ogni TableAdapter oggetto gestitoTableAdapterManager. Ad esempio, un set di dati con una tabella Customers e Orders viene generato con un oggetto TableAdapterManager che contiene CustomersTableAdapter proprietà e OrdersTableAdapter .
Proprietà UpdateOrder Controlla l'ordine dei singoli comandi di inserimento, aggiornamento ed eliminazione. Impostare questa proprietà su uno dei valori nell'enumerazione TableAdapterManager.UpdateOrderOption .

Per impostazione predefinita, UpdateOrder è impostato su InsertUpdateDelete. Ciò significa che gli inserimenti, gli aggiornamenti e le eliminazioni vengono eseguiti per tutte le tabelle nel set di dati.