0

我正在为 Oracle v7.7 使用 devart dotconnect,但遇到了意外错误。我将一条记录插入到表 A 中,然后将另一条记录插入到表 B 中,其中 B 有一个指向 A 的外键,并且我得到一个未找到父键的错误。

SsinpatDataContext dc = new SsinpatDataContext();
Document doc = new Document();
doc.Text = "bla bla bla";
var id = dc.ExecuteQuery<decimal>("SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL");
doc.Id = id.ElementAt(0);
dc.Documents.InsertOnSubmit(doc);

DocumentRows dr = new DocumentRows();
dr.Text = "bla bla bla";
dr.DocId = doc.Id;
dc.DocumentRows.InsertOnSubmit(dr);

dc.SubmitChanges();

这会引发文本“ORA-02291:违反完整性约束 - 未找到父键”的异常 在我看来,devart 试图首先提交 DocumentRows 对象,然后才是 Document 对象......

现在,我的问题是是否有一种方法可以强制提交执行顺序。

谢谢。

4

1 回答 1

0

问题可能是模型中实体类 Document 的 Id 属性的 IdGenerator 设置为 Sequence。而且,由于您在代码中执行此查询

"SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL"

下一个序列值被查询两次,差异是序列的最后一个值出现。您可以通过日志记录来检查它:

SsinpatDataContext dc = new SsinpatDataContext(){Log=Console.Out};

为了避免在您的场景中出现此错误,您应该将实体类 Document 的 Id 属性的 IdGenerator 设置为 None 并为您的模型重新生成代码。

但是,更好的情况如下:

1)为实体类Document的Id属性设置IdGenerator为Sequence;指定序列的名称,在您的情况下 - DOCUMENT_SEQ;

2)重写你的代码:

SsinpatDataContext dc = new SsinpatDataContext(){Log=Console.Out};
Document doc = new Document();
doc.Text = "bla bla bla";
DocumentRows dr = new DocumentRows();
dr.Text = "bla bla bla";
dr.Doc = doc;
dc.Documents.InsertOnSubmit(doc);
dc.SubmitChanges(); 
于 2013-06-05T11:16:14.053 回答