强类型数据集:插入多对多关系

时间:2009-11-30 00:42:25

标签: many-to-many strongly-typed-dataset

我在3个表格中有多对多关系: ProgramUserGroup 功能是两个主要表格,它们之间的链接是 LinkFeatureWithProgramUserGroup < / strong>,其中我有两个父表的外键关系。

我有一个带插入的数据集:我想向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>

当我更新表时,我收到错误:

“INSERT语句与FOREIGN KEY约束冲突”FK-LinkFeatu-Progr-7DCDAAA2“。冲突发生在数据库”x“,表”dbo.ProgramUserGroup“,列'id'。”

更新的代码如下:

 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);

但没有解决问题:(

谢谢,

1 个答案:

答案 0 :(得分:1)

,这是一个解决方法。

  

您需要告诉父表的表适配器刷新   更新操作后的数据表。   这就是你可以做到的。

  1. 打开 ProgramUserGroupTableAdapter - &gt;的属性默认选择查询 - &gt; Advnaced选项。并选中刷新数据表选项。立即保存适配器。现在,当您在表适配器上调用update时,数据表将在更新操作后更新[刷新],并将反映数据库表中的最新值。 如果主键或任何coloumn设置为自动递增,则数据表将在最近更新后显示最新值。

  2. 现在您可以将更新称为pug.Update(dsUserGroup.ProgramUserGroup);

  3. 从ProgramUserGroup coloumns中读取最新值,并在更新前将相应的值分配给子表。这将完全按照您的方式工作。

  4. alt text http://ruchitsurati.net/files/tds1.png