我有一个列表视图,在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”值更新为数据库的逻辑,我会很高兴。
答案 0 :(得分:5)
首先,你的using(get_datacontext){...}
街区在哪里?完成后你需要处理DataContext
!
总之...
我的猜测是更新语句生成的where子句太紧,或者只是完全错误。
我将检查Linq to Sql设计器中映射表中每个列的“Update Check”属性。最简单的方法是将主键列设置为Always
,并将所有其他列设置为Never
。您也可以考虑将它们设置为WhenChanged
。
设计师的默认行为通常是为所有内容设置为Always
;这不仅会导致更新的WHERE
条款,而且偶尔也会导致问题。显然,这种行为是正确的并发检查所必需的(即两个线程更新同一行);所以要注意这一点。
哦,考虑其他事情 - 如果您的表没有在设计器中指定主键,您也可以获得此行为 - 确保其中一列是。
最后,您可以检查调用SubmitChanges
时生成的SQL;通过将TextWriter附加到DataContext.Log属性;或者同样,VS2010中的IntelliTrace将收集所有在调试时运行的ADO.Net查询。这在调试L2S内容无法按预期工作时非常有用。
答案 1 :(得分:0)
您应该将更新后的客户添加到更新客户列表中。我的意思是在保存更改之前,您应该执行以下操作:db.AddToCustomers(customer)。在EF中使用AddToCustomers,我完全不知道它在LINQ中的等价物。