Winforms EntityFramework 6事务。回滚和提交
我需要创建一个取消按钮,该按钮将回滚自上次上下文保存以来的所有更改。我得到它是一个按钮点击回滚工作。然而,DataGridView并没有反映这一变化。如果我退出程序,我可以看到没有数据被更改 我使用了下面的表单(我在输出窗口中没有看到任何错误),但是,我读到的所有内容都表示要将上下文包装到using语句中。这在这种情况下仍然适用吗?我在保存方法try/catch中使用了Rollback和commit,但是这个平面ole看起来不正确。如果我生成另一个表单,它是否会添加到当前事务中Winforms EntityFramework 6事务。回滚和提交,winforms,entity-framework,transactions,dbcontext,rollback,Winforms,Entity Framework,Transactions,Dbcontext,Rollback,我需要创建一个取消按钮,该按钮将回滚自上次上下文保存以来的所有更改。我得到它是一个按钮点击回滚工作。然而,DataGridView并没有反映这一变化。如果我退出程序,我可以看到没有数据被更改 我使用了下面的表单(我在输出窗口中没有看到任何错误),但是,我读到的所有内容都表示要将上下文包装到using语句中。这在这种情况下仍然适用吗?我在保存方法try/catch中使用了Rollback和commit,但是这个平面ole看起来不正确。如果我生成另一个表单,它是否会添加到当前事务中 /// <
/// <summary>
/// </summary>
public partial class Form2 : Form
{
/// <summary>
/// </summary>
private TestContext _context;
/// <summary>
/// </summary>
private DbContextTransaction _transaction;
/// <summary>
/// </summary>
public Form2()
{
InitializeComponent();
}
/// <summary>
/// </summary>
/// <param name="e"></param>
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
_transaction.Rollback();
_context.Dispose();
}
/// <summary>
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_context = new TestContext();
_transaction = _context.Database.BeginTransaction();
SetupDataGridView();
}
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCancel_Click(object sender, EventArgs e)
{
_transaction.Rollback();
_context = new TestContext();
SetupDataGridView();
_transaction = _context.Database.BeginTransaction();
}
/// <summary>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
{
Validate();
PersonDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
_context.SaveChanges();
_transaction.Commit();
PersonBindingSource.ResetBindings(true);
_transaction = _context.Database.BeginTransaction();
}
/// <summary>
/// </summary>
private void SetupDataGridView()
{
_context.People.Load();
ObservableCollection<Person> people = _context.People.Local;
PersonBindingSource.DataSource = people.ToBindingList();
PersonBindingSource.RaiseListChangedEvents = true;
PersonDataGridView.AutoGenerateColumns = false;
PersonDataGridView.DataSource = PersonBindingSource;
}
}
//
///
公共部分类表单2:表单
{
///
///
私有测试上下文_上下文;
///
///
私有DbContextTransaction\u事务;
///
///
公共表格2()
{
初始化组件();
}
///
///
///
关闭时受保护的覆盖无效(CancelEventArgs e)
{
基数(e);
_transaction.Rollback();
_context.Dispose();
}
///
///
///
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
_context=newtestcontext();
_事务=_context.Database.BeginTransaction();
SetupDataGridView();
}
///
///
///
///
私有void btnCancel\u单击(对象发送者,事件参数e)
{
_transaction.Rollback();
_context=newtestcontext();
SetupDataGridView();
_事务=_context.Database.BeginTransaction();
}
///
///
///
///
私有void btnSave\u单击(对象发送方,事件参数e)
{
验证();
PersonDataGridView.CommittedIt(DataGridViewDataErrorContexts.Commit);
_SaveChanges();
_Commit();
PersonBindingSource.ResetBindings(true);
_事务=_context.Database.BeginTransaction();
}
///
///
私有void SetupDataGridView()
{
_context.People.Load();
ObservableCollection people=\u context.people.Local;
PersonBindingSource.DataSource=people.ToBindingList();
PersonBindingSource.RaiseListChangedEvents=true;
PersonDataGridView.AutoGenerateColumns=false;
PersonDataGridView.DataSource=PersonBindingSource;
}
}
不确定DataGridView
但大多数网格视图实际上都缓存了数据,并且只在修改列表时显示差异,而不是重新读取数据。它们通常有一个刷新的方法,但如果没有,请尝试将数据源设置为null
,然后返回列表,查看是否刷新。@Jcl,谢谢您的评论。DataGridView
具有Refresh()
,但没有刷新显示的值。我还将Datasource
更改为null
,然后将其设置回原位,但它也没有刷新显示的值。由于您正在将不同的DbContext
加载到Datasource
中,因此,除非您在其他地方做错了什么,否则我看不出有任何理由不起作用。我现在没有时间做一个测试项目。。。如果没有人回答提供更多的可能性,我明天会尝试做一个简单的,并尝试一下。