Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms EntityFramework 6事务。回滚和提交_Winforms_Entity Framework_Transactions_Dbcontext_Rollback - Fatal编程技术网

Winforms EntityFramework 6事务。回滚和提交

Winforms EntityFramework 6事务。回滚和提交,winforms,entity-framework,transactions,dbcontext,rollback,Winforms,Entity Framework,Transactions,Dbcontext,Rollback,我需要创建一个取消按钮,该按钮将回滚自上次上下文保存以来的所有更改。我得到它是一个按钮点击回滚工作。然而,DataGridView并没有反映这一变化。如果我退出程序,我可以看到没有数据被更改 我使用了下面的表单(我在输出窗口中没有看到任何错误),但是,我读到的所有内容都表示要将上下文包装到using语句中。这在这种情况下仍然适用吗?我在保存方法try/catch中使用了Rollback和commit,但是这个平面ole看起来不正确。如果我生成另一个表单,它是否会添加到当前事务中 /// <

我需要创建一个取消按钮,该按钮将回滚自上次上下文保存以来的所有更改。我得到它是一个按钮点击回滚工作。然而,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
中,因此,除非您在其他地方做错了什么,否则我看不出有任何理由不起作用。我现在没有时间做一个测试项目。。。如果没有人回答提供更多的可能性,我明天会尝试做一个简单的,并尝试一下。