Подтвердить что ты не робот

Контекст контекста Entity Framework?

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

4b9b3361

Ответ 1

Лучшим способом обновления объектов в вашем контексте является удаление вашего контекста и создание нового.

Если вам действительно нужно обновить какой-то объект, и вы используете подход 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#M:System.Data.Entity.Infrastructure.DbEntityEntry.Reload

Ответ 2

yourContext.Entry(yourEntity).Reload();

Ответ 3

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

Лучший совет в любом случае - попробуйте использовать "контекст коротких замыканий", и вы избежите подобных проблем.

Я написал несколько статей по этому вопросу:

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

Ответ 4

Используйте метод Обновить:

context.Refresh(RefreshMode.StoreWins, yourEntity);

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

Ответ 5

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

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

и его работоспособность.

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

e2 = new some_Entities(); //reset.