質問

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。

役に立ちましたか?

解決

はい、これには回避策があります。

  

親テーブルのテーブルアダプタに更新を指示する必要があります   更新操作後のデータテーブル。   これがその方法です。

  1. ProgramUserGroupTableAdapterのプロパティを開く-&gt;デフォルトの選択クエリ-&gt;高度なオプション。 [データテーブルを更新]オプションをオンにします。ここでアダプターを保存します。これで、table-adapterでupdateを呼び出すと、データテーブルは更新操作後に更新[更新] され、データベーステーブルの最新の値が反映されます。 主キーまたは任意の列が自動インクリメントに設定されている場合、データテーブルには最近の更新後の最新の値が含まれます。

  2. これで、更新をpug.Update(dsUserGroup.ProgramUserGroup);として呼び出すことができます;

  3. ProgramUserGroupカラムから最新の値を読み取り、更新前にそれぞれの値を子テーブルに割り当てます。これはまさにあなたが望むように機能します。

代替テキストhttp://ruchitsurati.net/files/tds1.png

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top