2011-02-12 103 views
1

在我的應用程序中,我實例化一個新的Linq-to-SQL對象,並將其傳遞給一個WinForms窗口,以便用戶可以填寫其餘的部分。在實例化新的Linq-to-SQL對象後防止插入

如果用戶取消表單,我不希望數據被插入。

問題是,當下次調用SubmitChanges時,記錄仍然被插入。

有沒有簡單的方法來防止這種情況?當我已經擁有所有我需要的字段時,我不想創建一個與Linq-to-SQL類具有相同字段的單獨類。

我發現這篇文章http://www.codeproject.com/KB/linq/linq-to-sql-detach.aspx,但它似乎解決了一個不同的問題,似乎並不像一個簡單的解決方案。

更新: 我能夠重現控制檯應用程序中的行爲。 這裏是我使用的代碼(與像客戶和地區不同的名稱):

MyDatabase db = new MyDataBase(@"Data Source:d:\test.sdf"); 
Customer customer = new Customer(); 
customer.Name = "customer 1"; 
customer.Country = db.Country.FirstOrDefault(); 

db.SubmitChanges(); 

爲我增加了「國家」分配新建分配FY線插入後立即發生。本例中的國家數據存儲在不同的表中。

+0

有沒有像'提交'和'取消'按鈕? – 2011-02-12 09:01:21

+0

@serkan是的輸入表單有一個保存和一個取消按鈕。在保存按鈕上,我將變量設置爲true。該變量在FormClosing-Event上被檢查。如果它是真的,表單的值將保存到LINQ2SQL對象(它是表單對象的成員)。 – fnx 2011-02-12 09:29:52

回答

3

除非您致電InsertOnSubmit,否則該記錄不會被插入,否則它將被附加到您的數據上下文中。

在將它發送到表單之前是否將它插入到數據庫中?我認爲如果你的用戶取消了表單,那麼這個對象就會被拋棄?

也許你可以發佈一些代碼,特別是在你創建對象的地方。

編輯:當您將其指定給db.Country.FirstOrDefault()時,看起來您的客戶正附加到datacontext。這些EntityRef/EntitySet關係是兩種方式 - 當您指定customer.Country = db.Country.FirstOrDefault()時,您也有效地說db.Country.FirstOrDefault().Customers.Add(customer),它將客戶作爲新對象添加到datacontext中。然後當您撥打SubmitChanges時,客戶將被插入。

最好的方法是(a)讓客戶離開國家,直到您去提交然後記錄,或者(b)如果用戶取消/未提交,則處置datacontext - 然後實例化新的背景。這些方法肯定會有效,並且是比目前更好的模式。

但是,更簡單的解決此問題的方法 - 無需任何代碼更改 - 可能會更改LINQ-to-SQL設計器中關係的屬性。這是解決當前問題的一種解決方法,它不是保持數據環境的根本問題的真正解決方法 - 它很可能會遇到更多問題。不過,請試試看,因爲這是一個非常簡單的修復方法。

  • 打開在Visual Studio
  • dbml的選擇客戶與國家之間的關係,然後查看屬性
  • 您會看到關係的孩子和家長的屬性。在Child部分中,您希望將'ChildProperty'(或可能是'IsChildProperty')設置爲false。

這樣做刪除Country對象的客戶屬性,將意味着你可以設置的國家,你正在做,沒有任何副作用的方式;即不會隱含地將客戶與國家相關聯。這意味着Country對象不再擁有「客戶」,因此您不會無意中將客戶附加到國家/地區。讓我知道這是否適合你!

0

當用戶取消表單時,您可以處理datacontext對象。當用戶再次打開表單時,您將實例化一個新的數據上下文。