使用强类型数据集在关系中插入行

时间:2009-08-25 12:51:40

标签: c# .net database ado.net strongly-typed-dataset

我在C#(.NET 3.5)中使用ADO.NET和强类型数据集。我想在两个以1:n关系相关的表中插入一个新行。

Attachments包含关系的主键部分,表LicenseAttachments包含外键部分。

AttachmentsDataSet.InvoiceRow invoice; // Set to a valid row, also referenced in InvoiceAttachments
AttachmentsDataSet.AttachmentsRow attachment;
attachment = attachmentsDataSet.Attachments.AddAttachmentsRow("Name", "Description");
attachmentsDataSet.InvoiceAttachments.AddInvoiceAttachmentsRow(invoice, attachment);

当然,当我第一次更新InvoicesAttachments表时,我会从SQL服务器中获取外键违规,所以我尝试先更新Attachments表,这将创建行,但是将删除InvoiceAttachments表中的附件关联。为什么呢?

如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

在表之间的关系上,确保选择“Both Relation and Foreign Key Constraint”并将“Update Rule”设置为“Cascade”。结合适配器上的“刷新数据表”选项,在插入父行后,更新的ID将“级联”关系,防止数据集中出现外键冲突。然后,您的子表将准备好正确插入数据库。

答案 1 :(得分:1)

有些事情要尝试:

配置tableadapter时,是否单击了高级选项,并检查“刷新数据表”以便它将检索标识列值?

对我来说,有时候我或者忘记检查它,或者它没有正确保存配置,因为我没有出于任何原因设置表格标识增量/种子。你在桌子上使用身份增量吗?

您可能还会考虑为这两个表重新创建适配器。

通常当我回过头来看时,我发现这对我来说是愚蠢的。

最后,您可以考虑在主表上调用update,然后手动获取主键值并在插入子记录时手动设置值。如果这没有意义,请告诉我,我会发布代码。

答案 2 :(得分:0)

  

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

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

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

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

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