1

我正在使用实体框架并将我的数据拉到网格中。我有一个弹出表单,可以让我添加一个新项目,如果我单击“确定”,它将把它添加到数据库上下文中。像这样:

private void tsb_AddGroup_Click(object sender, EventArgs e)
    {
        var group = new PeriodicReportGroup();

        frmGroups frm = new frmGroups(group);
        if (DialogResult.OK == frm.ShowDialog())
        {
            Database.PeriodicReportGroups.Add(group);
        }
        InitGrid();
    }

然后,在对话框关闭后,我希望我的网格刷新并拥有我刚刚添加的新项目。但是,由于我添加到上下文中的项目已由我实例化,而不是读取数据库,所以当我调试我的代码时,我可以看到虽然我的数据库上下文确实包含它,但它的类型与所有其他项目不同:我添加的是类型

{ReportData.PeriodicReportGroup} 

而其他的是类型

{System.Data.Entity.DynamicProxies.PeriodicReportGroup_3FCAD12B682C11C86AC1CF299E0617B21F74CC5F468C3577CE33B51A8CF38372}

因此,当我将我的 Db 上下文实体设置为网格的数据源时,新的实体会丢失,并且不会显示在网格中。

我找到了一种解决此问题的方法,即使用该Local属性:

gridGroups.DataSource = Database.PeriodicReportGroups.Local.ToList().Cast<IPeriodicReportGroup>().OrderBy(g => g.Name).ToList( );

只要之前引用了 Db 上下文实体,这将起作用。这使得在我们第一次加载网格时需要一些垃圾代码才能使其工作,如下所示:

if (Database.PeriodicReportGroups.Local.Count == 0)
        {
            var data = Database.PeriodicReportGroups.ToList();
        }

我不敢相信没有更好的方法来做到这一点。任何人都可以提供一些想法?谢谢!

4

0 回答 0