实体框架刷新上下文?

时间:2013-11-28 16:11:35

标签: c# asp.net entity-framework

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

7 个答案:

答案 0 :(得分:74)

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

如果确实需要刷新某个实体并且您正在使用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

答案 1 :(得分:54)

yourContext.Entry(yourEntity).Reload();

答案 2 :(得分:12)

使用Refresh方法:

context.Refresh(RefreshMode.StoreWins, yourEntity);

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

答案 3 :(得分:5)

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

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

并且工作正常。

答案 4 :(得分:0)

由于性能损失,建议不要使用重新加载刷新数据库上下文。在执行每个操作之前初始化dbcontext的新实例已经足够了并且是最佳实践。它还为您提供每个操作的刷新最新上下文。

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

答案 5 :(得分:0)

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

答案 6 :(得分:-6)

我让自己的头脑无所畏惧!答案非常简单 - 我刚回到基础......

some_Entities   e2 = new some_Entities(); //your entity.

在您更新/删除后添加以下行 - 您正在重新加载您的实体 - 没有花哨的系统方法。

e2 = new some_Entities(); //reset.