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

DeleteRuleカスケードを回避するには、とUpdateRuleをに設定する必要がありますRule.None

確かではありませんがAcceptRejectRule、accept/rejectコマンド自体がカスケードされているかどうかにのみ影響すると思います。あなたのコードでは、変更はカスケードされていると思いますが(そのようDeleteRuleUpdateRule設定されているため)、変更のみtable1が受け入れられています。の変更は受け入れられtable2ていません

于 2012-05-23T12:42:55.620 に答える
0

これが私の理解です。親子関係があり、relation.acceptrejectruleカスケードするように設定したとします。また、にdataadapter.acceptchangesduringupdate設定されていtrueます。親と子のレコードを変更してからdataadapter.update、最初に親に対してを実行すると、親と子のレコードが「受け入れられ」subsequent dataadapter.update、子のレコードに対してを実行すると、何も更新されません(「 accept」は親から子のレコードにカスケードされました)。したがって、親は更新されますが、子レコードは更新されません。考えられる解決策は、最初に子recを更新し、次に親を更新するか、または単にrelation.acceptrejectrulenoneに設定することです。そうすることで、「accept」は子レコードにカスケードされず、更新できるようになります。子レコードを更新すると、それらも「受け入れられ」ますdataadapter.acceptchangesduringupdatetrue。もちろん、データセット内のすべての変更を受け入れるように設定acceptchangesduringupdatefalseて実行することができます。manual dataset.acceptchangesただし、これを行う場合は、データセット内のすべてのテーブルを更新したことを確認してください。

私はここで、私のテストに基づいて起こっていると思うことだけを述べています。他の誰かが別のことを知っているなら、飛び込んでください。

于 2018-09-01T17:41:25.143 に答える