強く型付けされたデータセット:多対多の関係の挿入
-
08-07-2019 - |
質問
3つのテーブルに多対多のリレーションがあります: ProgramUserGroup と Feature は2つのメインテーブルであり、それらの間のリンクは LinkFeatureWithProgramUserGroup 、2つの親テーブルとの外部キー関係があります。
挿入のあるデータセットがあります:ProgramUserGroupに新しい行を追加し、LinkFeatureWithProgramUserGroupテーブルに関連する(既存の)フィーチャを追加します。 新しい行を挿入するとき、デフォルトIDを-1:に設定しています
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <DataSetUserGroup xmlns="http://tempuri.org/DataSetUserGroup.xsd">
<ProgramUserGroup diffgr:id="ProgramUserGroup1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<id>-1</id>
<Name>99999999999</Name>
<Active>false</Active>
</ProgramUserGroup>
<LinkFeatureWithProgramUserGroup diffgr:id="LinkFeatureWithProgramUserGroup1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
<id>-1</id>
<Feature_id>7</Feature_id>
<ProgramUserGroup_id>-1</ProgramUserGroup_id>
</LinkFeatureWithProgramUserGroup> </DataSetUserGroup> </diffgr:diffgram>
テーブルの更新中にエラーが発生します:
&quot; INSERTステートメントがFOREIGN KEY制約&quot; FK-LinkFeatu-Progr-7DCDAAA2&quot;と競合しました。データベース&quot; x&quot ;、テーブル&quot; dbo.ProgramUserGroup&quot ;、カラム 'id'。&quot;
で競合が発生しました更新のコードは次のとおりです。
DataSetUserGroupTableAdapters.LinkFeatureWithProgramUserGroupTableAdapter lfa = new LinkFeatureWithProgramUserGroupTableAdapter();
DataSetUserGroupTableAdapters.ProgramUserGroupTableAdapter pug = new ProgramUserGroupTableAdapter();
pug.Update(dsUserGroup.ProgramUserGroup);
lfa.Update(dsUserGroup.LinkFeatureWithProgramUserGroup);
ProgramUserGroupテーブルの新しい行のIDを確認すると、-1から@@ identity(1099など)に更新されているため、問題ありません-新しい行を挿入します。
ただし、LinkFeatureWithProgramUserGroupテーブルでは、関連するProgramUserGroup.IDの値はまだ-1であり、更新されませんでした。
リンクテーブルのキーも強制的に更新するにはどうすればよいですか? 試しました
pug.Update(dsUserGroup.ProgramUserGroup);
dsUserGroup.Merge(dsUserGroup.ProgramUserGroup);
lfa.Update(dsUserGroup.LinkFeatureWithProgramUserGroup);
しかし、問題は解決しませんでした:(
ありがとう、
b。
解決
はい、これには回避策があります。
親テーブルのテーブルアダプタに更新を指示する必要があります 更新操作後のデータテーブル。 これがその方法です。
-
ProgramUserGroupTableAdapterのプロパティを開く-&gt;デフォルトの選択クエリ-&gt;高度なオプション。 [データテーブルを更新]オプションをオンにします。ここでアダプターを保存します。これで、table-adapterでupdateを呼び出すと、データテーブルは更新操作後に更新[更新] され、データベーステーブルの最新の値が反映されます。 主キーまたは任意の列が自動インクリメントに設定されている場合、データテーブルには最近の更新後の最新の値が含まれます。
-
これで、更新をpug.Update(dsUserGroup.ProgramUserGroup);として呼び出すことができます;
-
ProgramUserGroupカラムから最新の値を読み取り、更新前にそれぞれの値を子テーブルに割り当てます。これはまさにあなたが望むように機能します。