我有一个 ListView ,其中包含 wpf Customername 和 Isvalid 中的两个列。我正在使用 linq to sql 从我的 sql 表中获取数据。当我尝试更新表中的值时,我没有看到任何更改表。
这是我点击保存按钮时的代码:
try
{
CustomersDataContext dataContext = new CustomersDataContext();
Customer customerRow = MyDataGrid.SelectedItem as Customer;
string m = customerRow.CustomerName;
Customer customer = (from p in dataContext.Customers
where p.CustomerName == customerRow.CustomerName
select p).Single();
customer.Isvalid=false;
dataContext.SubmitChanges();
MessageBox.Show("Row Updated Successfully.");
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
return;
}
我可以看到我可以根据所选的客户名称查询记录,但值没有更新。
如果有人能指出我在哪里缺少将“ISVALID”值更新到数据库的逻辑,我会很高兴。
最佳答案
首先,您的 using(get_datacontext){...}
block 在哪里?您需要在处理完 DataContext
后处理它们!
无论如何...
我的猜测是更新语句生成的 where 子句过于紧凑,或者完全错误。
我会在 Linq to Sql 设计器中检查映射表中每一列的“更新检查”属性。最简单的做法是将主键列设置为 Always
,并将所有其他列设置为 Never
。您还可以考虑将它们设置为 WhenChanged
。
设计者的默认行为一般是对所有的事情都设置为Always
;这不仅会导致可怕的 WHERE
更新子句,而且有时还会导致问题。显然,这种行为是正确的并发检查所必需的(即两个线程更新同一行);所以要注意这一点。
哦,想想别的东西 - 如果你的表没有在设计器中指定的主键,你也可以得到这种行为 - 确保其中一列是。
最后,您可以检查调用 SubmitChanges
时生成的 SQL;通过将 TextWriter 附加到 DataContext.Log属性(property);或者同样,如果您开始调试,VS2010 中的 IntelliTrace 将收集所有运行的 ADO.Net 查询。这对于调试为什么 L2S 东西没有按预期工作是非常宝贵的。
关于c# - linq to sql提交更改不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9231278/