2013-06-04 35 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之前,這工作正常。我會按照你的提示進行記錄,試着更好地理解發生的事情。 –

相關問題