【发布时间】:2011-01-27 00:06:34
【问题描述】:
我有一个 C# 应用程序,它必须按层次顺序插入一个父记录和至少四个子记录。 IOW,父合同适用于一个或多个位置,每个位置有一个或多个项目,每个项目有一个或多个服务,每个服务有一个或多个要求。应用程序首先获取一组 Oracle 序列号,每个记录的每个表序列中都有一个。无论出于何种原因(遗留数据库),每条记录不仅有其父序列号,还有合同序列号。
因此,代码开始一个事务,使用父级序列号插入父级,然后尝试插入位置记录——已经填充了作为 FK 的父级编号和它自己的表序列号。但是,我收到一个 Oracle-02291 错误,指出由于找不到父编号,因此违反了 FK。
INSERT into Contracts (contract_sequence_number, ...) values (10437, ...);
INSERT into Locations (location_sequence_number, contract_sequence_number, ...)
values (23733, 10437, ...);
...
我猜这是因为父级尚未提交,因此不可用。但是,如果 any 的子记录失败,则我无法提交父级,因此在子级插入之前进行提交。
我知道这是一个很常见的场景,答案一定是菜鸟。但是,到目前为止,我找到的所有答案都暗示父序列号是在“表中”找到的,以满足 FK。
非常感谢任何关于我如何解决此问题的想法。
兰迪
【问题讨论】:
-
您不能将插入拆分成两个单独的函数吗?将父记录的 ID 返回到您的 C# 代码,然后使用它来执行子插入?
-
实际上,它们在同一个事务块中的两个独立函数中。我只是显示两个 SQL 语句来澄清我的问题。
标签: c# oracle transactions parent-child