Devart dotconnect - 有没有办法强制提交订单?

时间:2013-06-04 13:59:48

标签: c# oracle devart

我正在使用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对象......

现在,我的问题是我们是否有办法强制提交执行顺序。

感谢。

1 个答案:

答案 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();