在实例化新的Linq-to-SQL对象后阻止插入

时间:2011-02-12 07:45:22

标签: c# linq-to-sql

在我的应用程序中,我实例化一个新的Linq-to-SQL对象并将它(带有一些值)传递给WinForms窗口,以便用户可以填写其余部分。

如果用户取消表单,我不希望插入数据。

问题是,下次调用SubmitChanges时,仍会插入记录。

有一种简单的方法可以防止这种情况吗?当我已经拥有我需要的所有字段时,我不想创建一个与Linq-to-SQL类相同字段的单独类。

我发现这篇文章http://www.codeproject.com/KB/linq/linq-to-sql-detach.aspx,但它似乎解决了一个不同的问题,似乎不是一个简单的解决方案。

更新: 我能够在控制台应用程序中重现该行为。 这是我使用的代码(使用不同的名称,如Customer和Country):

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

db.SubmitChanges();

一旦我添加了“Country”分配行,就会发生插入。此示例中的国家/地区数据存储在不同的表中。

2 个答案:

答案 0 :(得分:3)

除非您调用InsertOnSubmit,否则不会插入记录,否则记录会附加到您的datacontext。

在将表单发送到表单之前,是否将其插入数据库?我假设如果您的用户取消表单,那么该对象将被丢弃?

也许您可以发布一些代码,特别是在您创建对象的位置。

编辑:当您为客户分配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设计器中更改关系的属性。这是针对您的直接问题的解决方法,它不是对保持datacontext的基本问题的真正解决方案 - 您可能会遇到更多问题。不过要试一试,因为这是一个非常简单的修复。

  • 在Visual Studio中打开dbml
  • 选择“客户”和“国家/地区”之间的关系,然后查看“属性”
  • 您将看到该关系的Child和Parent的属性。在Child部分中,您要将'ChildProperty'(或者可能是'IsChildProperty')设置为false。

执行此操作会删除Country对象上的Customers属性,这意味着可以以您正在执行的方式设置国家/地区而不会产生任何副作用;即它不会隐含地将客户与国家相关联。这意味着Country对象不再“拥有”Customers,因此您不会意外地将Customer附加到Country。如果这对您有用,请告诉我!

答案 1 :(得分:0)

当用户取消表单时,您可以处理datacontext对象。当用户再次打开表单时,您实例化一个新的datacontext。