ForeignKeyConstraint外键约束的使用

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
对子行不执行任何操作。这是默认设置。
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值