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

6

我正在使用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表中的附件关联。为什么?

如何解决这个问题?


只是一点提醒...当我使用强类型数据集时,每次实例化它都会导致巨大的性能损失。 - Zoidberg
是的,我知道。那你用什么代替呢?只是使用简单类型的数据集吗? - Manuel Faux
@Manuel:你的 strongly typed 数据集和我在 asp.net 项目数据集中找到的是一样的吗?也就是说,你有自动生成的表适配器,还是手动创建它们? - Breadtruck
@Breadtruck:是的,我使用自动生成的数据集和表适配器。 - Manuel Faux
你对这个问题的进展如何?你找到是什么问题了吗? - Breadtruck
显示剩余2条评论
3个回答

4

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


1

一些尝试:

当您配置表适配器时,是否单击高级选项并选中“刷新数据表”,以便检索标识列值?

对我来说,有时我要么忘记了检查它,要么由于某种原因没有设置表标识增量/种子,因此它没有正确保存配置。您是否在使用表上的标识增量?

您还可以考虑仅重新创建这两个表的适配器。

通常当我回顾所有内容时,我发现是我自己犯了一个愚蠢的错误。

最后,您可以考虑在主表上调用更新,然后手动获取主键值,并在插入子记录时手动设置该值。如果这不合理,请告诉我,我会发布代码。


0
你需要告诉父表的表适配器在更新操作后刷新数据表。以下是如何实现的方法:
1. 打开“ProgramUserGroupTableAdapter -> Default Select Query -> Advnaced options”属性,勾选“Refresh the data table”的选项,然后保存适配器。现在,当您调用表适配器的更新操作时,“data-table”将在更新操作后更新[刷新],并反映数据库表中的最新值。如果主键或任何列设置为自动递增,则“data-table”将具有最新值。
2. 现在,您可以通过pug.Update(dsUserGroup.ProgramUserGroup)调用更新。
3. 在更新之前,从ProgramUserGroup列读取最新值,并将相应的值赋给子表。这将按照您的要求正常工作。 alt text http://ruchitsurati.net/files/tds1.png

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接