对于 DataContext,GetChangeSet 在 SubmitChanges 后停止工作

For DataContext, GetChangeSet stops working after SubmitChanges

在我们的项目中,我们有多个 System.Data.Linq.DataContext 对象用于不同的 Windows 表单。

当表单上的数据绑定控件发生更改(如名称)时,我们通过检查 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);
}

单击保存按钮时,我们在 DataContext 上调用 SubmitChanges on the Linq DataContext followed by a call to a ClearCache extension:

bool IFormPanelAccessor.CommitChanges<T>(T record)
{
    _dc.SubmitChanges();
    _dc.ClearCache();
}

ClearCache在静态扩展class中定义如下:

public static void ClearCache(this DataContext dc)
{
    dc.GetType().InvokeMember("ClearCache", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, dc, null);
}

保存后,DataContext 中的后续更改不再通过 GetChangeSet 检测到。

InsertUpdate 之后调用的数据库上有一个 trigger .这会以某种方式破坏 DataContext 检测变化的能力吗?

如何让 GetChangeSet 在调用 SubmitChanges 后检测数据绑定控件的更改?

与原问题中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 导致当前记录失去与数据的连接。

事后看来很简单,但我从来没有意识到这一点。