取消EF上下文更改时为什么不更新集合?

时间:2014-11-12 15:38:26

标签: c# winforms entity-framework entity-framework-4 bindingsource

我正在使用.NET 4.0,我从这样的列表中获取数据库的结果:

List<Customers> customers = context.Customers().ToList();

然后我将其分配给BindingSource

bindingSource1.DataSource = null;
bindingSource1.DataSource = customers;

bindingSource用作网格视图的数据源,可以执行更改 - 添加新记录,编辑,删除。 问题是当我想取消更改并将gridview中的数据恢复为数据库中的数据时。

我有以下代码取消更改:

private void cancelChanges()
    {
        // Refresh the modified entries
        var objectsModified = context.ObjectStateManager.GetObjectStateEntries(
                                System.Data.EntityState.Modified | System.Data.EntityState.Deleted)
                                .Select(e => e.Entity);

        context.RefreshFromDb(objectsModified);

        // Detach the added entries
        var objectsAdded = context.ObjectStateManager.GetObjectStateEntries(
                               System.Data.EntityState.Added)
                               .Select(e => e.Entity);

        foreach (var item in objectsAdded)
        {
            context.Customers().Detach(item as Customers);
        }
    }

我可以看到它有效,但问题是List仍然保留旧记录(应该被取消),因此也是绑定源,最后它们仍然显示在网格中。

1 个答案:

答案 0 :(得分:1)

由于您从上下文写入列表,因此您只能获得单向数据绑定。要做你想做的事,尝试这样的事情:

context.Customers().Load();
bindingSource1.DataSource = context.Customers.Local.ToBindingList();
dataGridView1.DataSource = gridSource; 

问题是您告诉数据库放弃更改,但由于您的列表在此时与控件绑定并且从数据库中分离,因此您无法看到反映的更改。或者,您可以在调用CancelChanges以从数据库重新加载当前数据后再次调用customers = context.Customers().ToList()