我在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
表中的附件关联。为什么呢?
如何解决这个问题?
答案 0 :(得分:4)
在表之间的关系上,确保选择“Both Relation and Foreign Key Constraint”并将“Update Rule”设置为“Cascade”。结合适配器上的“刷新数据表”选项,在插入父行后,更新的ID将“级联”关系,防止数据集中出现外键冲突。然后,您的子表将准备好正确插入数据库。
答案 1 :(得分:1)
有些事情要尝试:
配置tableadapter时,是否单击了高级选项,并检查“刷新数据表”以便它将检索标识列值?
对我来说,有时候我或者忘记检查它,或者它没有正确保存配置,因为我没有出于任何原因设置表格标识增量/种子。你在桌子上使用身份增量吗?
您可能还会考虑为这两个表重新创建适配器。
通常当我回过头来看时,我发现这对我来说是愚蠢的。
最后,您可以考虑在主表上调用update,然后手动获取主键值并在插入子记录时手动设置值。如果这没有意义,请告诉我,我会发布代码。
答案 2 :(得分:0)
您需要告诉父表的表适配器刷新 更新操作后的数据表。 这就是你可以做到的。
打开 ProgramUserGroupTableAdapter - >的属性默认选择查询 - > Advnaced选项。并选中刷新数据表选项。立即保存适配器。现在,当您在表适配器上调用update时,数据表将在更新操作后更新[刷新],并将反映数据库表中的最新值。 如果主键或任何coloumn设置为自动递增,则数据表将在最近更新后显示最新值。
现在您可以将更新称为pug.Update(dsUserGroup.ProgramUserGroup);
从ProgramUserGroup coloumns中读取最新值,并在更新前将相应的值分配给子表。这将完全按照您的方式工作。