2

ADO.Net 中 ForeignKeyConstraint 类的AcceptRejectRule属性的生活目的是什么?

MSDN 文档没有提供足够的解释(对我来说)来明确其目的。阅读文档后,我认为将属性设置为 None 将防止从父表到子表的任何更改级联。但是,在运行以下代码后,这个假设被证明是错误的:

       DataTable table1 = new DataTable("Customers");

        table1.Columns.Add(new DataColumn("CustomerID", typeof(int)));
        table1.Columns.Add(new DataColumn("CustomerName", typeof(string)));

        DataTable table2 = new DataTable("Orders");
        table2.Columns.Add(new DataColumn("OrderID", typeof(int)));
        table2.Columns.Add(new DataColumn("CustomerID", typeof(int)));

        DataSet dataSet = new DataSet();
        dataSet.Tables.AddRange(new DataTable[] { table1, table2 });
        dataSet.EnforceConstraints = true;

        DataRelation dataRelation = new DataRelation("CustomerOrders", table1.Columns["CustomerID"],
            table2.Columns["CustomerID"], true);
        dataSet.Relations.Add(dataRelation);

        Debug.WriteLine("No. of constaints in the child table = {0}", table2.Constraints.Count);

        dataRelation.ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.None;
        dataRelation.ChildKeyConstraint.DeleteRule = Rule.Cascade;
        dataRelation.ChildKeyConstraint.UpdateRule = Rule.Cascade;

        table1.Rows.Add(new object[] { 11, "ABC" });
        table1.Rows.Add(new object[] { 12, "XYZ" });

        table2.Rows.Add(new object[] { 51, 12 });
        table2.Rows.Add(new object[] { 52, 11 });
        table2.Rows.Add(new object[] { 53, 11 });

        table1.Rows.RemoveAt(0);
        table1.AcceptChanges();
        table2.AcceptChanges();

        Debug.WriteLine("No of rows in the parent table = {0}", table1.Rows.Count);
        Debug.WriteLine("No of rows in the child table = {0}", table2.Rows.Count);

上述代码的输出是:

子表中的约束数 = 1
父表
中的行数 = 1 子表中的行数 = 1

谢谢,
迪内什

4

2 回答 2

1

为避免级联,您需要设置DeleteRuleUpdateRuleto Rule.None

我不确定,但我相信AcceptRejectRule只会影响接受/拒绝命令本身是否级联。在您的代码中,我猜这些更改已被级联(因为这是已设置的方式),但只有更改DeleteRule已被接受;上的更改未被接受。UpdateRuletable1table2

于 2012-05-23T12:42:55.620 回答
0

这是我的理解。假设您有父子关系,并且您将其设置relation.acceptrejectrule为级联。您还可以dataadapter.acceptchangesduringupdate设置为true,如果您修改父记录和子记录,然后dataadapter.update先对父记录执行 a ,则父记录和子记录将被“接受”,如果您subsequent dataadapter.update对子记录执行 a ,则不会更新任何内容(因为“接受”从父记录级联到子记录)。所以你的父母得到了更新,但没有孩子的记录。可能的解决方案是先更新子记录,然后更新父记录,或者简单地将其设置relation.acceptrejectrule为无。通过这样做,“接受”不会级联到子记录,您将能够更新它们。当您对子记录进行更新时,它们也将被“接受”dataadapter.acceptchangesduringupdatetrue. 当然,您可以设置acceptchangesduringupdatefalse执行 amanual dataset.acceptchanges以接受数据集中的所有更改。但如果您这样做,请确保您已对数据集中的所有表进行了更新。

我只是在这里根据我的测试说明我认为正在发生的事情。如果其他人有不同的认识,请加入。

于 2018-09-01T17:41:25.143 回答