我有一個LINQ to sql語句,在數據庫中插入記錄。如果有重複,則拋出主鍵違例。LINQ to SQL - 錯誤處理
發生這種情況後,每當我嘗試執行任何其他語句時,它都會重複顯示此錯誤。這是交易未關閉的問題嗎?另外如何在LINQ to SQL中以更可靠的方式處理事務
我有一個LINQ to sql語句,在數據庫中插入記錄。如果有重複,則拋出主鍵違例。LINQ to SQL - 錯誤處理
發生這種情況後,每當我嘗試執行任何其他語句時,它都會重複顯示此錯誤。這是交易未關閉的問題嗎?另外如何在LINQ to SQL中以更可靠的方式處理事務
每個DataContext實例都會跟蹤它所看到的映射類的實例。當你說:myDataContext.InsertOnSubmit(myCustomer);
你正在用這個DataContext註冊一個客戶實例。稍後,當您說myDataContext.SubmitChanges();
時,DataContext會嘗試執行它正在跟蹤的所有更改。
爲了有沒有跟蹤記錄,它不能插入一個DataContext,你應該放棄這種情況下和新再升一位。
您是否重複使用相同DataContext
?如果是這樣,不要這樣做 - 爲每個邏輯操作創建一個新的DataContext並使用TransactionScope
來管理事務
爲什麼在嘗試保存記錄之前檢查重複記錄?
投擲異常非常昂貴。
如果您的主鍵字段是標識字段,當您將其插入到數據庫時,請勿填寫。例如,假設一個客戶表的結構如下:
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事務的上下文中執行所有更改。
因此,是不必要的旅行到數據庫。 – 2010-05-10 15:59:14