Answers:
刷新上下文中的实体的最佳方法是处理上下文并创建一个新的上下文。
如果您确实需要刷新某些实体,并且您在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/zh-cn/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.113).aspx# M: System.Data.Entity.Infrastructure.DbEntityEntry重新加载
context.ReloadNavigationProperty(parent, p => p.Children);
如果有的话可以使用class Parent { ICollection<Child> Children; }
context.Entry(order).Collection(o => o.NavigationProperty).Query().Load();
如果要重新加载特定实体,则使用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();
}
}
如果您使用的是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);
}
无论如何,最好的建议是,尝试使用“短期环境”,这样可以避免此类问题。
关于此事,我写了几篇文章:
((IObjectContextAdapter)dbContext).ObjectContext
context.Reload()在MVC 4,EF 5中对我不起作用,所以我这样做了。
context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);
及其工作正常。
在我的方案中,实体框架未获取新更新的数据。原因可能是数据已超出其范围进行了更新。提取后刷新数据解决了我的问题。
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();
?
.Reload()
在EF6中不可用。@CsabaToth
由于性能下降,不建议使用Reload刷新db上下文。在执行每个操作之前初始化dbcontext的新实例已足够好,并且是最佳实践。它还为您提供了每个操作的最新上下文。
using (YourContext ctx = new YourContext())
{
//Your operations
}