2010-05-10 90 views
4

我有一個LINQ to sql語句,在數據庫中插入記錄。如果有重複,則拋出主鍵違例。LINQ to SQL - 錯誤處理

發生這種情況後,每當我嘗試執行任何其他語句時,它都會重複顯示此錯誤。這是交易未關閉的問題嗎?另外如何在LINQ to SQL中以更可靠的方式處理事務

回答

4

每個DataContext實例都會跟蹤它所看到的映射類的實例。當你說:myDataContext.InsertOnSubmit(myCustomer);你正在用這個DataContext註冊一個客戶實例。稍後,當您說myDataContext.SubmitChanges();時,DataContext會嘗試執行它正在跟蹤的所有更改。

  • 如果這些更改失敗 - DataContext不會停止跟蹤它們,並會在每次調用SubmitChanges時嘗試進行更改。

爲了有沒有跟蹤記錄,它不能插入一個DataContext,你應該放棄這種情況下和新再升一位。

0

您是否重複使用相同DataContext?如果是這樣,不要這樣做 - 爲每個邏輯操作創建一個新的DataContext並使用TransactionScope來管理事務

-1

爲什麼在嘗試保存記錄之前檢查重複記錄?

投擲異常非常昂貴。

+3

因此,是不必要的旅行到數據庫。 – 2010-05-10 15:59:14

1

如果您的主鍵字段是標識字段,當您將其插入到數據庫時,請勿填寫。例如,假設一個客戶表的結構如下:

Customer 
======== 
Customer_ID (PK, identity) 
Last_Name (varchar) 
First_Name (varchar) 
Middle_Initial (char) 

這是可能的:

public int CreateCustomer(string lastName, string firstName, string middleInitial) 
{ 
    using (DataContext dc = new DataContext()) 
    { 
     Customer customer = new Customer(); 

     customer.Last_Name = lastName; 
     customer.First_Name = firstName; 
     customer.Middle_Initial = middleInitial; 
     dc.Customers.InsertOnSubmit(customer); 
     dc.SubmitChanges(); 

     return customer.Customer_ID; 
    } 
} 

最可能的原因是你的錯誤是,你正試圖在DataContext後訪問實體對象在其中創建它已被銷燬。使用上面的例子,這將產生類似於你可能收到一個錯誤:

public int CreateCustomer(string lastName, string firstName, string middleInitial) 
{ 
    using (DataContext dc = new DataContext()) 
    { 
     Customer customer = new Customer(); 

     customer.Last_Name = lastName; 
     customer.First_Name = firstName; 
     customer.Middle_Initial = middleInitial; 
     dc.Customers.InsertOnSubmit(customer); 
     dc.SubmitChanges(); 
    } 

    return customer.Customer_ID; // <<-- Error occurs here 
} 

出現錯誤的原因是由於LINQ引擎的內置更改跟蹤。創建DataContext時,在該DataContext中創建的任何實體對象都通過實體對象內的引用與該DataContext綁定。一旦DataContext超出範圍,引用不再有效,並且實體對象的內容不再被認爲是LINQ引擎可靠的。

就事務處理而言,創建DataContext時會創建一個事務。當調用SubmitChanges時,無論涉及多少個實體/表,都會在DataContext事務的上下文中執行所有更改。