我正在使用EntityFramework.Extended库执行批处理更新。唯一的问题是EF无法跟踪该库执行的批量更新。因此,当我DbContext
再次查询时,它不会返回更新的实体。
我发现AsNoTracking()
在查询时使用method会禁用跟踪并从数据库中获取新数据。但是,由于EF无法跟踪使用查询的实体AsNoTracking()
,因此我无法对查询的数据执行任何更新。
有什么方法可以强制EF在跟踪更改时获取最新数据?
我正在使用EntityFramework.Extended库执行批处理更新。唯一的问题是EF无法跟踪该库执行的批量更新。因此,当我DbContext
再次查询时,它不会返回更新的实体。
我发现AsNoTracking()
在查询时使用method会禁用跟踪并从数据库中获取新数据。但是,由于EF无法跟踪使用查询的实体AsNoTracking()
,因此我无法对查询的数据执行任何更新。
有什么方法可以强制EF在跟踪更改时获取最新数据?
Answers:
请尝试执行以下操作刷新单个实体:
Context.Entry<T>(entity).Reload()
编辑:
要获取实体集合的新数据,值得DbContext
在每次请求后尝试处置该实例。
DbSet
。
我在寻找问题的解决方案时偶然发现了这个问题,该问题是我在更新实体后导航属性未填充的地方。每当我尝试从数据库重新加载实体时,它都会从本地存储中获取条目,而不会通过延迟加载来填充导航属性。我发现没有破坏上下文并重新创建上下文,而是使代理工作时可以获取新数据:
_db.Entry(entity).State = EntityState.Detached;
其背后的逻辑是-我的更新附加了该实体,因此它可以跟踪对其的更改。这会将其添加到本地商店。此后,任何尝试检索具有功能代理的实体都将导致其获取本地代理,而不是前往db并返回一个新的,启用代理的实体。我尝试了上面的reload选项,该选项确实会从数据库中刷新对象,但这并不能为您提供具有延迟加载功能的代理对象。我尝试做一个Find(id), Where(t => t.Id = id), First(t => t.Id = id)
。最后,我检查了提供的可用状态,并看到存在“已分离”状态。尤里卡!希望这对某人有帮助。
我在类中声明了没有赋值的实体变量。这使我可以处理实例,而不会丢失该变量供其他方法参考。我刚刚遇到了这个问题,所以它没有很多运行时,但是到目前为止,它似乎运行良好。
public partial class frmMyForm
{
private My_Entities entity;
public frmMyForm()
{
InitializeComponent();
}
private void SomeControl_Click(object sender, EventArgs e)
{
db.SaveChanges();
db.Dispose();
entity = new My_Entities();
//more code using entity ...
}