Aggiunta di vincoli alla tabella

Constraints consente di applicare restrizioni ai dati di una DataTable, in modo da garantire l'integrità di tali dati. Un vincolo è una regola automatica applicata a una colonna, o a colonne correlate, che consente di determinare le azioni da intraprendere in caso di modifica del valore di una riga. I vincoli vengono applicati quando la proprietà EnforceConstraints del DataSet è true.

In ADO.NET sono disponibili due tipi di vincoli: ForeignKeyConstraint e UniqueConstraint. In base all'impostazione predefinita, entrambi i vincoli vengono creati automaticamente quando si crea una relazione tra due o più tabelle aggiungendo un DataRelation al DataSet. È tuttavia possibile disabilitare questo comportamento specificando createConstraints = false quando si crea la relazione.

ForeignKeyConstraint

Un ForeignKeyConstraint consente di applicare regole relative alla modalità di propagazione di aggiornamenti ed eliminazioni alle tabelle correlate. Se ad esempio un valore di una riga di una tabella viene aggiornato o eliminato e tale valore viene utilizzato anche in una o più tabelle correlate, un vincolo ForeignKeyConstraint consentirà di determinare gli effetti di tale modifica sulle tabelle correlate.

Mediante le proprietà DeleteRule e UpdateRule di ForeignKeyConstraint è possibile definire l'operazione da eseguire quando un utente tenta di eliminare o aggiornare una riga in una tabella correlata. Nella tabella seguente vengono descritte le diverse impostazioni disponibili per le proprietà DeleteRule e UpdateRule di ForeignKeyConstraint.

Regola Descrizione
Cascade Consente di eliminare o aggiornare le righe correlate. Si tratta dell'impostazione predefinita.
SetNull Imposta i valori delle righe correlate su DBNull.
SetDefault Imposta i valori delle righe correlate sul valore predefinito.
None Consente di specificare che non è necessario intraprendere alcuna azione nelle righe correlate.

Un vincolo ForeignKeyConstraint consente di limitare, oltre che propagare, le modifiche alle colonne correlate. In base alle proprietà impostate per il vincolo ForeignKeyConstraint di una colonna e nel caso in cui la proprietà EnforceConstraints del DataSet sia impostata su true, l'effettuazione di determinate operazioni sulla riga padre provocherà un'eccezione. Se ad esempio la proprietà DeleteRule del vincolo ForeignKeyConstraint è impostata su None, non sarà possibile eliminare una riga padre nel caso in cui a tale riga siano associate righe figlio.

È possibile creare un vincolo di chiave esterna tra singole colonne o tra una matrice di colonne utilizzando il costruttore ForeignKeyConstraint e passando l'oggetto ForeignKeyConstraint risultante al metodo Add della proprietà Constraints della tabella, che è un ConstraintCollection. È inoltre possibile passare argomenti di costruttore a svariati overload del metodo Add di una ConstraintCollection, per creare un ForeignKeyConstraint.

Quando si crea un vincolo ForeignKeyConstraint, è possibile passare i valori DeleteRule e UpdateRule al costruttore come argomenti o impostare tali valori come proprietà, come illustrato nell'esempio seguente (dove per il valore UpdateRule viene utilizzata l'impostazione predefinita, Cascade).

Dim custOrderFK As ForeignKeyConstraint = New ForeignKeyConstraint("CustOrderFK", _
                                            custDS.Tables("CustTable").Columns("CustomerID"), _
                                            custDS.Tables("OrdersTable").Columns("CustomerID"))
custOrderFK.DeleteRule = Rule.None  
' Cannot delete a customer value that has associated existing orders.
custDS.Tables("OrdersTable").Constraints.Add(custOrderFK)
[C#]
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
                                     custDS.Tables["CustTable"].Columns["CustomerID"], 
                                     custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;  
// Cannot delete a customer value that has associated existing orders.
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);

AcceptRejectRule

È possibile accettare le modifiche apportate alle righe utilizzando il metodo AcceptChanges o annullare tali modifiche utilizzando il metodo RejectChanges di DataSet, DataTable o DataRow. Se in un DataSet sono contenuti vincoli ForeignKeyConstraints, la chiamata dei metodi AcceptChanges o RejectChanges provocherà l'applicazione di AcceptRejectRule. La proprietà AcceptRejectRule del vincolo ForeignKeyConstraint consente di determinare l'azione da intraprendere nelle righe figlio quando il metodo AcceptChanges o RejectChanges viene chiamato nella riga padre.

Nella tabella seguente vengono elencati i valori disponibili per il metodo AcceptRejectRule.

Azione Descrizione
Cascade Consente di accettare o rifiutare le modifiche alle righe figlio.
None Consente di specificare che non è necessario intraprendere alcuna azione nelle righe figlio. Si tratta dell'impostazione predefinita.

UniqueConstraint

L'oggetto UniqueConstraint, che può essere assegnato a una singola colonna o a una matrice di colonne in una DataTable, consente di assicurare che tutti i dati della colonna o delle colonne specificate siano univoci in qualsiasi riga. È possibile creare un vincolo univoco per una colonna o una matrice di colonne utilizzando il costruttore UniqueConstraint e passando l'oggetto UniqueConstraint risultante al metodo Add della proprietà Constraints della tabella, che è un ConstraintCollection. È inoltre possibile passare argomenti di costruttore a svariati overload del metodo Add di una ConstraintCollection, per creare un UniqueConstraint. Quando si crea un vincolo UniqueConstraint per una o più colonne, è possibile, se lo si desidera, specificare se la colonna o le colonne sono una chiave primaria.

È possibile creare un vincolo univoco per una colonna impostando la proprietà Unique della colonna su true. In alternativa è possibile impostare la proprietà Unique di una singola colonna su false, per rimuovere eventuali vincoli univoci esistenti. La definizione di una o più colonne come chiave primaria per una tabella consentirà di creare automaticamente un vincolo univoco per la colonna o le colonne specificate. Se si rimuove una colonna dalla proprietà PrimaryKey di una DataTable, il vincolo UniqueConstraint verrà rimosso.

L'esempio seguente consente di creare un vincolo UniqueConstraint per due colonne di una DataTable.

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custUC As UniqueConstraint = New UniqueConstraint(New DataColumn() _
                              {custTable.Columns("CustomerID"), _
                               custTable.Columns("CompanyName")})
custDS.Tables("Customers").Constraints.Add(custUC)
[C#]
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUC = new UniqueConstraint(new DataColumn[] 
                              {custTable.Columns["CustomerID"], 
                               custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUC);

Vedere anche

Creazione e utilizzo di DataSet | Classe DataRelation | Classe DataTable | Classe ForeignKeyConstraint | Classe UniqueConstraint