2011-02-12 63 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对象。当用户再次打开表单时,您将实例化一个新的数据上下文。