实体框架刷新上下文? ?

我怎样才能更新我的上下文?我有一个基于数据库视图的实体,当我对一个表进行更新的时候,实体有导航属性到视图,这个实体是更新的,但是视图不会根据新的更新进行刷新... 只是想从数据库中再次获得数据。 Thanks!

193074 次浏览

使用 刷新方法:

context.Refresh(RefreshMode.StoreWins, yourEntity);

或者另外处理当前上下文并创建一个新上下文。

The best way to refresh entities in your context is to dispose your context and create a new one.

如果 really需要刷新某个实体,并且正在对 DbContext 类使用 CodeFirst 方法,则可以使用

    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 已经给出了答案。

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

If you are using Entity Framework 4.1+ (EF5, or EF 6 probably), DbContext API:

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

如果使用 entityFramework4(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/

Refreshing db context with Reload is not recommended way due to performance loses. It is good enough and the best practice to initialize a new instance of the dbcontext before each operation executed. It also provide you a refreshed up to date context for each operation.

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

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