实体框架刷新上下文?

use*_*557 88 c# asp.net entity-framework

我怎样才能刷新我的背景?我有基于我的数据库中的视图的实体,当我对一个表具有视图导航属性的实体进行更新时,实体是更新但视图不刷新符合新的更新...只是想再次从Db数据.谢谢!

RX_*_*_RX 82

刷新上下文中实体的最佳方法是处置上下文并创建一个新上下文.

如果你真的需要刷新一些实体而你正在使用Code First方法和DbContext类,你可以使用

    public static void ReloadEntity<TEntity>(
        this DbContext context, 
        TEntity entity)
        where TEntity : class
    {
        context.Entry(entity).Reload();
    }
Run Code Online (Sandbox Code Playgroud)

要重新加载集合导航属性,您可以使用

    public static void ReloadNavigationProperty<TEntity, TElement>(
        this DbContext context, 
        TEntity entity, 
        Expression<Func<TEntity, ICollection<TElement>>> navigationProperty)
        where TEntity : class
        where TElement : class
    {
        context.Entry(entity).Collection<TElement>(navigationProperty).Query();
    }
Run Code Online (Sandbox Code Playgroud)

参考:https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.113).aspx# M: System.Data.Entity.Infrastructure.DbEntityEntry .Reload

  • 你能提供ReloadNavigationProperty thx的样本用法吗? (5认同)
  • 我不明白为什么这个解决方案得到如此高的评价。context.Entry(entity).Collection&lt;TElement&gt;(navigationProperty).Query() 不会重新加载子集合。它只为您提供一个 Iqueryable 表示用于获取集合的查询。它实际上什么也没做。 (4认同)
  • 我无法使它重新加载子导航属性。 (2认同)

kra*_*s88 61

yourContext.Entry(yourEntity).Reload();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会重新加载集合导航属性,只会重新加载实体条目本身. (16认同)
  • 感谢您轻松解决方案.我没有看到在像RX_DID_RX这样的扩展方法中封装它的必要性 (3认同)

Chr*_*uez 26

如果您想使用DbContextApi重新加载特定实体,RX_DID_RX已经为您提供了答案.

如果要重新加载/刷新加载的所有实体:

如果您使用的是Entity Framework 4.1+(可能是EF5或EF 6),DbContext API:

public void RefreshAll()
{
     foreach (var entity in ctx.ChangeTracker.Entries())
     {
           entity.Reload();
     }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是entityFramework 4(ObjectContext API):

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);

     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}
Run Code Online (Sandbox Code Playgroud)

无论如何最好的建议是,尝试使用"短暂的背景",你将避免这种问题.

我写了几篇关于此事的文章:

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

  • 防止“集合已修改;枚举操作可能无法执行”。错误我不得不将 foreach 更改为 for `varEntity = _context.ChangeTracker.Entries().ToArray(); for (int i = 0; i &lt;Entity.Length; i++) {Entity[i].Reload(); } }` (3认同)

Alb*_*rto 15

使用Refresh方法:

context.Refresh(RefreshMode.StoreWins, yourEntity);
Run Code Online (Sandbox Code Playgroud)

或者替代地处理您当前的上下文并创建一个新的上下文.

  • 这在Entity Framework 6中不起作用 (36认同)
  • 我认为它只适用于objectcontext但不适用于dbcontext.他们之间的对话是必需的 (5认同)
  • @batmaci可以使用`((IObjectContextAdapter)dbContext).ObjectContext轻松完成. (3认同)
  • 并没有这么说不完整。 (2认同)

小智 6

context.Reload()在MVC 4,EF 5中没有为我工作所以我这样做了.

context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);
Run Code Online (Sandbox Code Playgroud)

它的工作正常.