我该如何刷新我的上下文?我有基于数据库视图的实体,当我对一个具有导航属性到视图的表实体进行更新时,实体被更新了,但视图没有根据新的更新进行刷新...我只想从数据库中再次获取数据。 谢谢!
我该如何刷新我的上下文?我有基于数据库视图的实体,当我对一个具有导航属性到视图的表实体进行更新时,实体被更新了,但视图没有根据新的更新进行刷新...我只想从数据库中再次获取数据。 谢谢!
刷新上下文实体的最佳方法是释放当前上下文,然后创建一个新的上下文。
如果您确实需要刷新某个实体,并且正在使用 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();
}
yourContext.Entry(yourEntity).Reload();
如果您想使用DbContextApi重新加载特定实体,则RX_DID_RX已经给出了答案。
如果您想重新加载/刷新您加载的所有实体:
如果您正在使用Entity Framework 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);
}
无论如何最好的建议是,尝试使用“短生命周期上下文”,这样就可以避免此类问题。
我写了几篇关于此事的文章:
var entities = _context.ChangeTracker.Entries().ToArray();
for (int i = 0; i < entities.Length; i++)
{
entities[i].Reload();
}
- Muflix((IObjectContextAdapter)dbContext).ObjectContext
简单地实现。 - Daniel Z.在MVC 4,EF 5中,context.Reload()对我不起作用,因此我做了以下操作。
context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);
它很好地运行了。
在我的场景中,Entity Framework 没有获取到新更新的数据。原因可能是数据在其范围之外被更新了。获取数据后刷新解决了我的问题。
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);
}
_context.Entry(entity).Reload();
更好? - Csaba Toth.Reload()
方法。@CsabaToth - Mahbubur Rahman使用 Reload 刷新数据库上下文并不是推荐的方法,因为会导致性能损失。最好的做法是在执行每个操作之前初始化一个新的 dbcontext 实例。这样可以为每个操作提供一个更新的、最新的上下文。
using (YourContext ctx = new YourContext())
{
//Your operations
}
class Parent { ICollection<Child> Children; }
,你可以使用context.ReloadNavigationProperty(parent, p => p.Children);
。 - Jinjinovcontext.Entry(order).Collection(o => o.NavigationProperty).Query().Load();
。 - Rubenisme