如何强制Entity Framework始终从数据库获取更新的数据?


85

我正在使用EntityFramework.Extended库执行批处理更新。唯一的问题是EF无法跟踪该库执行的批量更新。因此,当我DbContext再次查询时,它不会返回更新的实体。

我发现AsNoTracking()在查询时使用method会禁用跟踪并从数据库中获取新数据。但是,由于EF无法跟踪使用查询的实体AsNoTracking(),因此我无法对查询的数据执行任何更新。

有什么方法可以强制EF在跟踪更改时获取最新数据?


2
29k的观看次数,对此只有19个赞...好吧,我还是添加了我的内容
jleach

Answers:


147

请尝试执行以下操作刷新单个实体:

Context.Entry<T>(entity).Reload()

编辑: 要获取实体集合的新数据,值得DbContext在每次请求后尝试处置该实例。


谢谢!有什么方法可以重新加载一组实体而不是一个?最好是整个DbSet
Saravana 2014年

您是否还需要其他任何内容才能将其视为答案?
PlTaylor 2014年

1
是的,它仍然没有显示如何重新加载实体集合。
萨拉瓦纳2014年

1
您是否尝试过处置dbcontext并创建一个新的dbcontext?
PlTaylor 2014年

2
我花了几个小时才得出这个结论。那编辑的答案是什么帮我找到了我的解决方案。谢谢!
BeemerGuy

17

我在寻找问题的解决方案时偶然发现了这个问题,该问题是我在更新实体后导航属性未填充的地方。每当我尝试从数据库重新加载实体时,它都会从本地存储中获取条目,而不会通过延迟加载来填充导航属性。我发现没有破坏上下文并重新创建上下文,而是使代理工作时可以获取新数据:

_db.Entry(entity).State = EntityState.Detached;

其背后的逻辑是-我的更新附加了该实体,因此它可以跟踪对其的更改。这会将其添加到本地商店。此后,任何尝试检索具有功能代理的实体都将导致其获取本地代理,而不是前往db并返回一个新的,启用代理的实体。我尝试了上面的reload选项,该选项确实会从数据库中刷新对象,但这并不能为您提供具有延迟加载功能的代理对象。我尝试做一个Find(id), Where(t => t.Id = id), First(t => t.Id = id)。最后,我检查了提供的可用状态,并看到存在“已分离”状态。尤里卡!希望这对某人有帮助。


您应在何处应用Detached状态以使延迟加载工作?我尝试了您的解决方案,但它对我不起作用,我必须错过一些东西。您的帮助将不胜感激
雷克斯

2
我弄清楚了:1.保存实体,2.将状态设置为分离,3.从数据库读取实体。感谢您的提示!
Rex

1

使代码在相同的上下文中运行不会产生更新的实体。它只会在两次运行之间追加在数据库中创建的新实体。EF强制重装可以这样进行:

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();

1

我在类中声明了没有赋值的实体变量。这使我可以处理实例,而不会丢失该变量供其他方法参考。我刚刚遇到了这个问题,所以它没有很多运行时,但是到目前为止,它似乎运行良好。

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 ...
}

0

对我来说...我像这样访问我的DbContext:

_viewModel.Repo.Context

要强制EF击中数据库,我这样做:

_viewModel.Repo.Context = new NewDispatchContext();

用新实例覆盖当前的DbContext。然后,下次我使用数据服务时,它们将从数据库中获取数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.