在我们的项目中,我们为不同的Windows表单提供了多个System.Data.Linq.DataContext个对象。
当表单上的数据绑定控件发生更改时(如名称),我们通过检查GetChangeSet方法启用或禁用“保存”按钮。
private void ContentChanged(object sender, EventArgs e)
{
var changes = GetChangeSet();
int numChanges = changes.Deletes.Count + changes.Inserts.Count + changes.Updates.Count;
btnSubmit.Enabled = (numChanges > 0);
}
点击“保存”按钮后,我们会在Linq DataContext 上调用SubmitChanges,然后在 DataContext 上调用ClearCache extension:
bool IFormPanelAccessor.CommitChanges<T>(T record)
{
_dc.SubmitChanges();
_dc.ClearCache();
}
ClearCache 在静态扩展类中定义如下:
public static void ClearCache(this DataContext dc)
{
dc.GetType().InvokeMember("ClearCache", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, dc, null);
}
保存后, GetChangeSet 不再检测 DataContext 中的后续更改。
在插入或更新之后调用的数据库上有触发器。这会以某种方式破坏 DataContext 检测更改的能力吗?
在调用 SubmitChanges 后,如何让 GetChangeSet 检测数据绑定控件的更改?
答案 0 :(得分:0)
与原始问题中的jdweng评论类似,我找到了重新加载数据的方法。
private void CommitChanges()
{
// mCustomer is a record from the CustomerRecords Linq DataTable
var rowId = mCustomer.RowId;
_dc.SubmitChanges();
_dc.ClearCache();
// After ClearCache, it seems I need to physically pull the data again:
mCustomer = _dc.CustomerRecords.FirstOrDefault(c => c.RowId == rowId);
// Use the new record to update the controls on the form
LoadData(mCustomer);
}
我的猜测是 ClearCache 导致当前记录失去与数据的连接。
事后似乎很简单,但我从未意识到这一点。