2013-06-04 80 views
0

我正在为Oracle v7.7使用devart dotconnect,并且出现意外错误。 我插入一个记录到表A中,然后另一个记录到表B中,其中B有一个外键给A,并且我得到一个父键未找到错误。Devart dotconnect - 有没有办法强制执行命令?

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

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

"SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL" 

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

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

为了避免您的方案这个错误,你应该设置IdGenerator为无实体类文件的ID属性,然后重新生成模型的代码。

然而,更好的情况是以下内容:

1)设置到IdGenerator序列实体类文件的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(); 
+0

感谢您的答复。但是,我没有设置IdGenerator。在我们从v6.3升级到7.7之前,这工作正常。我会按照你的提示进行记录,试着更好地理解发生的事情。 –

相关问题