2012-09-12 40 views
1

我具有由1 realted兩個表 - 1維吾爾。是這樣的:隱含的LINQ to SQL事務

DOC:ID,SN(編號是主鍵) 子:ID,名稱(ID爲外鍵)

DOC.Id和Sub.Id都與1 - 1正如我在業務對象提到

現在我覺得數據類如下:

DOC doc = new DOC(); 
doc.SN = 1; 
Sub sub = new Sub(); 
sub.Name = "name"; 
doc.Sub = sub; 

using(dbDataContext db = new dbDataContext()) 
{ 
    db.DOC.InsertOnSubmit(doc); 
    db.SubmitChanges(); 
    sub.Id = doc.Id; 
    db.Sub.InsertOnSubmit(sub); 
    db.SubmitChanges(); 
} 

最後SubmitCh ()拋出一個異常(不能插入對象已經存在)

回到數據庫我發現兩個對象都是在執行完代碼後插入的。
是一個隱式事務還是我做錯了什麼

回答

1

LINQ2SQL是堅持在第一SubmitChanges()

db.DOC.InsertOnSubmit(doc); 

保存doc,及其子對象圖doc.Sub

這是不相關的隱性交易,它只是,當家長的重視與InsertOnSubmit DataContext的() L2SQL也會自動附加其子項。

如果你想爲小組一個明確的「插入」,然後不分配小組到文件,直到文件的的SubmitChanges()之後(即插入帶有空子的文檔)。

這是manually detach一旦連接從一個DataContext對象相當困難的。

1

您是否嘗試過簡單地除去第一的SubmitChanges,讓您的代碼如下所示:

using(dbDataContext db = new dbDataContext()) 
{ 
    db.DOC.InsertOnSubmit(doc); 
    sub.Id = doc.Id; 
    db.Sub.InsertOnSubmit(sub); 
    db.SubmitChanges(); 
} 

我想這個問題是你的第一個SubmitChanges電話後,DOC仍然標記爲插入,當你打電話SubmitChanges再次,因爲它已經存在於數據庫中它給人的錯誤。

的DB上下文跟蹤的變化,所以你應該真的只是調用SubmitChanges一次。