Entity Framework Обновить контекст?

Как я могу обновить свой контекст? У меня есть сущности, основанные на представлениях из моей базы данных, и когда я сделал обновление для одной таблицы Entity, у которой есть свойства навигации к представлениям, сущность обновляется, но представление не обновляется в соответствии с новыми обновлениями... просто хочу получить снова от ДБ данные. Спасибо!

7 ответов

Лучший способ обновить сущности в вашем контексте - это избавиться от контекста и создать новый.

Если вам действительно нужно обновить какую-либо сущность и вы используете подход Code First с классом DbContext, вы можете использовать

    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

yourContext.Entry(yourEntity).Reload();

Если вы хотите перезагрузить определенные объекты с помощью 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 (API ObjectContext):

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/

Используйте метод Refresh:

context.Refresh(RefreshMode.StoreWins, yourEntity);

или, альтернативно, избавьтесь от текущего контекста и создайте новый.

context.Reload() не работал для меня в MVC 4, EF 5, поэтому я сделал это.

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

и работает нормально.

EF 6

В моем сценарии 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);
}

Обновление контекста БД с помощью Reload не рекомендуется из-за потери производительности. Это достаточно хорошо и рекомендуется инициализировать новый экземпляр dbcontext перед каждой выполненной операцией. Он также предоставляет обновленный контекст для каждой операции.

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

На самом деле я предлагаю удалить всю сущность и воссоздать ее в зависимости от вашего подхода.

Я сделал свою собственную голову болеть из-за ничего! Ответ был очень прост - я просто вернулся к основам...

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

добавьте эту строку ниже после того, как вы обновите / удалите - вы перезагружаете свою сущность - никаких необычных системных методов.

e2 = new some_Entities(); //reset.
Другие вопросы по тегам