我不明白EF5 dbContext.Entry(entity). reload()方法应该如何工作
本文关键字:何工作 工作 方法 reload dbContext EF5 Entry entity 明白 | 更新日期: 2023-09-27 18:16:36
在本例中:
using System;
using System.Collections.Generic;
using dbModel;
using System.Linq;
using System.Data.Entity.Infrastructure;
namespace WinApp
{
public partial class Form1 : Form
{
private dbEntities dbc;
public IQueryable<ARTIKLI> art;
public IQueryable<ART_GRUPE> grp;
public Form1()
{
InitializeComponent();
dbc = new dbEntities();
}
private void GetData()
{
art = from a in dbc.ARTIKLIs
select a;
grp = from g in dbc.ART_GRUPE
select g;
artikliBindingSource.DataSource = art.ToList();
artGrupeBindingSource.DataSource = grp.ToList();
}
private void Form1_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
dbc.SaveChanges();
}
private void loadData_Click(object sender, EventArgs e)
{
this.GetData();
}
private void refresh_Click(object sender, EventArgs e)
{
dbc.Entry(grp).Reload();
artGrupeBindingSource.ResetBindings(false);
}
}
}
一切构建正常。但是当我运行并点击刷新按钮时,我得到错误:
实体类型DbQuery ' 1不是当前上下文模型的一部分
我正在尝试使用DbContext
从grp
实体实例的存储中刷新数据。我知道我可以将DbContext
转化为ObjectContext
,然后使用Refresh
方法,但是DbContext.Entry(entity).Reload();
如果dbEntities
是DbContext
,那么你正在谈论做,有效的dbc.Entry<ART_GRUPE>().Reload();
,放弃所有更改并重新加载实体,而不是重新加载您的查询。然而,这并不存在。您可以使用dbc.Entry<ART_GRUPE>(myEntity).Reload()
("MSDN - DbEntityEntry
DbContext
并不意味着是长期存在的,你应该在你的查询中使用它,然后摆脱它。如果想将其强制转换为对象上下文,可以尝试:
var ctx = ((IObjectContextAdapter)db).ObjectContext;
ctx.Refresh();
这可能不是你需要的。它也不会从您的上下文中删除从数据库中删除的实体,而且它并不总是刷新关系。您可能最好摆脱上下文并重新加载它:
private void GetData()
{
// you could wrap this in a using statement, though that isn't necessary
using (var dbc = new dbEntities())
{
art = from a in dbc.ARTIKLIs
select a;
grp = from g in dbc.ART_GRUPE
select g;
artikliBindingSource.DataSource = art.ToList();
artGrupeBindingSource.DataSource = grp.ToList();
}
}
private void refresh_Click(object sender, EventArgs e)
{
GetData();
// not sure you need this next line now, but you should test
artGrupeBindingSource.ResetBindings(false);
}
这可能导致的问题是您正在更改ARTIKLIs
并试图跟踪它们。为此,您可以使用以下内容来保存更改,并且不要每次都重新加载ARTIKLIs
:
private void GetData(bool loadArtikli = true)
{
// you could wrap this in a using statement, though that isn't necessary
using (var dbc = new dbEntities())
{
if (loadArtikli)
{
art = from a in dbc.ARTIKLIs
select a;
}
grp = from g in dbc.ART_GRUPE
select g;
artikliBindingSource.DataSource = art.ToList();
artGrupeBindingSource.DataSource = grp.ToList();
}
}
private void refresh_Click(object sender, EventArgs e)
{
GetData(false);
}
public static void UpdateARTIKLI(ARTIKLI item)
{
using (var dbc = new dbEntities())
{
if (item.Id > 0)
{ // update existing ones
var dbitem = context.ARTIKLI
.Find(item.Id);
context.Entry(dbItem)
.CurrentValues
.SetValues(item);
}
else
{ // deal with new ones
context.ARTIKLI.Add(item);
}
context.SaveChanges();
}
}