ForeignKeyConstraint表示删除或更新某个值或行时,对主键
/外键关系中一组数据列强制进行的操作限制。
ForeignKeyConstraint 限制在删除或更新一列(或多列)的值时所执行的操作。这种约束旨在用于主键列。在两个表的父
/子关系中,从父表删除一个值或行可能会以下列方式之一影响子表的子行:可能会同时删除子行(级联操作);可能会将子列中的值设置为空值;可能会将子列中的值设置为默认值;可能生成异常。
MSDN中只有
VB示例
Private suppliersProducts As SuppliersProducts
Private Sub CreateConstraint()
Dim parentColumn As DataColumn
Dim childColumn As DataColumn
Dim fkeyConstraint As ForeignKeyConstraint
parentColumn = suppliersProducts.Tables("Suppliers").Columns("SupplierID")
childColumn = suppliersProducts.Tables("Products").Columns("SupplierID")
fkeyConstraint = New ForeignKeyConstraint( _
"SupplierFKConstraint", parentColumn, childColumn)
fkeyConstraint.DeleteRule = Rule.SetNull
fkeyConstraint.UpdateRule = Rule.Cascade
fkeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade suppliersProducts.Tables("Products").Constraints.Add(fkeyConstraint)
suppliersProducts.EnforceConstraints = True
End Sub
为了维护数据的完整性,可以使用约束来对
DataTable 中的数据施加限制。约束是应用于某列或相关各列的自动规则,它决定了某行的值以某种方式更改时的操作过程。
当
DataSet 的 EnforceConstraints 属性为 true 时(
默认为 true),就可强制使用约束。
ADO.NET 中有两种约束:
ForeignKeyConstraint 和 UniqueConstraint。默认情况下,通过将 DataRelation 添加到 DataSet 来创建两个或多个表之间的关系时,两种约束都会自动创建。但是,也可以在创建关系时,通过指定 createConstraints = false 禁用这一行为。
ForeignKeyConstraint
如果更新或删除了一个表的某行中的值,并且一个或多个相关的表中也使用了同样的值,
ForeignKeyConstraint 会决定相关表中发生的操作。
ForeignKeyConstraint 的
DeleteRule 和 UpdateRule 属性定义在用户试图删除或更新相关表中某行时采取的操作。下表描述可用于 ForeignKeyConstraint 的 DeleteRule 和 UpdateRule 属性的不同设置。
规则设置
|
说明
|
Cascade
|
删除或更新相关的行。
|
SetNull
|
将相关行中的值设置为
DBNull。
|
SetDefault
|
将相关行中的值设置为默认值。
|
None
|
对相关行不执行任何操作。这是默认设置。
|
ForeignKeyConstraint 可以限制并传播对相关列的更改。根据为列的
ForeignKeyConstraint 设置的属性,并且如果 DataSet 的 EnforceConstraints 属性是 true,对父行执行某些特定操作将会导致异常。例如,如果 ForeignKeyConstraint 的 DeleteRule 属性是 None,那么在父行有子行的情况下,则无法删除父行。
在创建
ForeignKeyConstraint 时,可以将 DeleteRule 和 UpdateRule 值作为参数传递给构造函数,也可以作为属性进行设置,如以下示例所示(其中 DeleteRule 值设置为 None)。
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK",
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);
AcceptRejectRule
可使用
AcceptChanges 方法接受对行的更改,或者使用 DataSet、DataTable 或 DataRow 的 RejectChanges 方法取消对行的更改。DataSet 包含 ForeignKeyConstraints 时,调用 AcceptChanges 或 RejectChanges 方法会强制使用 AcceptRejectRule。ForeignKeyConstraint 的 AcceptRejectRule 属性决定了对父行调用 AcceptChanges 或 RejectChanges 时要对子行执行的操作。
下表列出了
AcceptRejectRule 的可用设置。
规则设置
|
说明
|
Cascade
|
接受或拒绝对子行的更改。
|
None
|
对子行不执行任何操作。这是默认设置。
|