如何在关闭窗体并返回到主窗体时刷新实体框架上下文



我的问题:

我正在尝试制作主从形式。在我的主窗体中处于编辑模式时,使用 f5 键调用 Zoom() 并打开一个新窗体,我可以在其中添加更多与我的主窗体数据网格显示的内容相关的内容。

当我添加更多内容或删除并保存时,关闭该窗体并返回到我的主窗体。它不会注意到该主窗体中的更改。如果我关闭并重新打开我的主窗体,它将显示更改。

这里以我删除了g2并保存为例,

当我返回主窗体并尝试编辑现有项目,甚至添加新项目时,它仍将g2显示为现有项目。但是,如果我再次使用 f5 打开我的第二个表单,我可以清楚地看到该记录实际上并不存在。如果我关闭并重新打开我的主窗体,将显示更改。

主窗体编辑模式 - 从此处按 f5 将导致调用 Zoom()

我的第二个表格和其中的项目

[

删除g2并保存][3]

[

G2仍处于主形式][4]

[

即使我取消/保存并尝试添加新项目][5]

[

在关闭和开放更改时][6]

评论中的其他链接

到目前为止,我已经尝试过:

调用新表格后立即

主人。条目(a).重新加载,

masterEntities master = new masterEntities(),

重置 BindingSource predmetbindingsource.datasource = master.predmets.AsNoTracking() 的数据源。ToListAsync();

和 .resetcurrentitem()

一些代码:

主要形式:

private async void Zoom()
    {
        if (nastavniPlanProgramsDataGridView.SelectedCells.Count == 1 && nastavniPlanProgramsDataGridView.SelectedCells[0].ColumnIndex == 0)
            {
                NastavniPlanProgramForm f2 = new NastavniPlanProgramForm();
                if (f2.ShowDialog() == DialogResult.OK)
                {

                    predmetBindingSource.DataSource = await master.Predmets.AsNoTracking().ToListAsync();
                    Predmet a = (Predmet)f2.Selected;
                    NastavniPlanProgram s = (NastavniPlanProgram)nastavniPlanProgramsBindingSource.Current;
                    s.idPredmet = a.idPredmet;
                }
            }
        }

我正在更改的实体称为Predmet,它的绑定源是predmetbindingsource,我的上下文称为master,并在主窗体的开头全局初始化:

 public partial class Studijski_program : Form
{
    masterEntities master = new masterEntities();

    public Studijski_program()
    {         
        InitializeComponent();
/

/blablabla..

在关闭时以另一种形式,我只是在做 context.dispose()

你的代码有点难以阅读,部分原因是我怀疑它不是英文的,但这里有一些观察结果:

我假设masterEntities是从DbContext派生出来的。 DbContext应该是暂时的,并且仅在请求的生存期内持续存在。 他们不应该存在很长时间。 我们让它们保持瞬态的原因之一是因为它们执行了大量缓存,而缓存问题可能会导致您遇到的症状。

尝试在查询新masterEntities之前对其进行实例化

var db = new masterEntities();
predmetBindingSource.DataSource = await db.Predmets.AsNoTracking().ToListAsync();

如果这不起作用,请使用调试器检查并查看它是否实际上是与 dbContext 相关的问题。 在设置predmetBindingSource.DataSource的行之后创建一个断点,并确保它实际上已设置。

最新更新