【问题标题】:Devart dotconnect - Is there a way to force the commit order?Devart dotconnect - 有没有办法强制提交顺序?
【发布时间】:2013-06-05 19:16:14
【问题描述】:

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

现在,我的问题是我们是否可以强制提交执行顺序。

谢谢。

【问题讨论】:

    标签: c# oracle devart


    【解决方案1】:

    问题可能是模型中实体类 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(); 
    

    【讨论】:

    • 感谢您的回复。但是,我没有设置 IdGenerator。这在我们从 v6.3 升级到 7.7 之前运行良好。我将按照您的日志记录提示尝试更好地了解正在发生的事情。
    猜你喜欢
    • 2014-01-02
    • 2011-03-28
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2011-05-07
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多