实体框架刷新上下文



如何刷新上下文?我有基于数据库中视图的实体,当我对一个具有视图导航属性的表实体进行更新时,该实体会更新,但视图不会根据新的更新进行刷新。。。只想从Db中再次获取数据。谢谢

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

如果真的需要刷新一些实体,并且您正在使用DbContext类的Code First方法,则可以使用

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

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

    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();
    }

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

yourContext.Entry(yourEntity).Reload();

如果您想重新加载特定实体,使用DbContextApi,RX_DID_RX已经给出了答案。

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

如果您正在使用实体框架4.1+(可能是EF5或EF6),DbContext API:

public void RefreshAll()
{
     var entitiesList = ctx.ChangeTracker.Entries().ToList();
     foreach (var entity in entitiesList)
     {
           entity.Reload();
     }
}

如果您正在使用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);
}

无论如何,最好的建议是,尽量使用";短命语境";这样你就可以避免这种问题。

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

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

使用刷新方法:

context.Refresh(RefreshMode.StoreWins, yourEntity);

或者另一种选择是处理当前上下文并创建一个新上下文。

context.Road()在MVC 4、EF 5中对我不起作用,所以我这样做了。

context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);

而且运行良好。

EF 6

在我的场景中,实体框架没有获取最新更新的数据。原因可能是数据更新超出了其范围。获取后刷新数据解决了我的问题。

private void RefreshData(DBEntity entity)
{
    if (entity == null) return;
    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entity);
}
private void RefreshData(List<DBEntity> entities)
{
    if (entities == null || entities.Count == 0) return;
    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entities);
}

由于性能下降,不建议使用Reload刷新数据库上下文。在执行每个操作之前初始化dbcontext的新实例已经足够好了,也是最佳实践。它还为每个操作提供了一个更新的最新上下文。

using (YourContext ctx = new YourContext())
{
   //Your operations
}

最新更新