我正在使用实体框架并将我的数据拉到网格中。我有一个弹出表单,可以让我添加一个新项目,如果我单击“确定”,它将把它添加到数据库上下文中。像这样:
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();
}
我不敢相信没有更好的方法来做到这一点。任何人都可以提供一些想法?谢谢!