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

时间:2018-04-05 15:23:04

标签: c# linq datacontext

在我们的项目中,我们为不同的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 检测数据绑定控件的更改?

1 个答案:

答案 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 导致当前记录失去与数据的连接。

事后似乎很简单,但我从未意识到这一点。