在我的应用程序中,我实例化一个新的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”分配行,就会发生插入。此示例中的国家/地区数据存储在不同的表中。
答案 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的基本问题的真正解决方案 - 您可能会遇到更多问题。不过要试一试,因为这是一个非常简单的修复。
执行此操作会删除Country对象上的Customers属性,这意味着可以以您正在执行的方式设置国家/地区而不会产生任何副作用;即它不会隐含地将客户与国家相关联。这意味着Country对象不再“拥有”Customers,因此您不会意外地将Customer附加到Country。如果这对您有用,请告诉我!
答案 1 :(得分:0)
当用户取消表单时,您可以处理datacontext对象。当用户再次打开表单时,您实例化一个新的datacontext。