对于 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 检测到。
在 Insert 或 Update 之后调用的数据库上有一个 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 导致当前记录失去与数据的连接。
事后看来很简单,但我从来没有意识到这一点。
在我们的项目中,我们有多个 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 检测到。
在 Insert 或 Update 之后调用的数据库上有一个 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 导致当前记录失去与数据的连接。
事后看来很简单,但我从来没有意识到这一点。