我正在使用devart dotconnect for Oracle v7.7,并且出现意外错误。 我在表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对象......
现在,我的问题是我们是否有办法强制提交执行顺序。
感谢。
答案 0 :(得分:0)
问题可能是IdGenerator设置为模型中实体类Document的Id属性的Sequence。并且,由于您在代码中执行此查询
"SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL"
查询下一个序列值两次,差异是序列的最后一个值。您可以通过记录来检查:
SsinpatDataContext dc = new SsinpatDataContext(){Log=Console.Out};
要避免在您的方案中出现此错误,您应该将IdGenerator设置为None,以获取实体类Document的Id属性,并重新生成模型的代码。
但是,更好的方案如下:
1)将IdGenerator设置为Sequence,用于实体类Document的Id属性;指定序列的名称,在您的情况下 - 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();