2009-08-25 56 views
6

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

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表中。为什么?

我该如何解决这个问题?

+0

只是一个笔记......当我使用强类型数据集时,每次实例化时都会有巨大的性能。 – Zoidberg 2009-08-25 12:54:33

+0

是的,我知道这一点。你用什么来代替?简单地键入DataSets? – 2009-08-25 12:56:33

+0

@Manuel:您的强类型数据集与我在asp.net项目数据集中找到的数据集相同,因为您有自动生成的表格adpaters或者您是否手动创建它们? – Breadtruck 2009-08-25 13:08:44

回答

4

在表之间的关系,确保“两个关系和外键约束”被选中,“更新规则”设置为“级联”。结合适配器上的“刷新数据表”选项,插入父行后,更新的ID将“关联”到关系中,从而防止数据集中的外键违规行为。然后您的子表将准备好正确插入数据库。

1

有些事情尝试:

在配置TableAdapter的,你点击高级选项,并检查“刷新数据表”,以便它将检索标识列值?

对我来说,有时我要么忘了检查它,或者它没有正确保存配置,因为我并没有因为种种原因,我的表标识增量/结实。你在桌上使用身份增量吗?

你也可以考虑只是重新创建这两个表的适配器。

通常当我回去了一切,我觉得这是我的一部分了一些愚蠢的。

最后,你可能会考虑在主表上调用update,然后手动抓住主键值,并手动设置值,当你插入子记录。如果这没有意义,请告诉我,我将发布代码。

0

你需要告诉你的父表的表适配器更新操作后刷新 数据表。 这是你如何做到的。 >默认选择查询 - - 的ProgramUserGroupTableAdapter

  1. 打开属性> Advnaced选项。并检查选项刷新数据表。现在保存适配器。现在,当您调用表适配器上的更新时,数据表将在更新操作后更新[刷新],并将反映数据库表中的最新值。 如果主键或任何色彩设置为自动递增,则数据表将在最近更新后具有最新值。

  2. 现在你可以调用更新为pug.Update(dsUserGroup.ProgramUserGroup);

  3. 从程序用户组颜色中读取最新值并在更新之前将相应的值分配到子表中。这将按照你想要的方式工作。

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