ObjectContext.Обновить()?

Как обновить ВСЕ грязные объекты из хранилища данных и сбросить их измененные значения до исходного значения хранилища?

Метод ObjectContext.Refresh требует обновления объектов в качестве параметра.


person Shimmy Weitzhandler    schedule 17.11.2009    source источник


Ответы (4)


Обычно работает следующее:

Context.Refresh(RefreshMode.StoreWins, _
    Context.ObjectStateManager.GetObjectStateEntries())

Иногда это вызывает проблемы с EntityRelations. посмотрите на мой комментарий для получения дополнительной информации.

person Shimmy Weitzhandler    schedule 17.11.2009
comment
Это просто сэкономило мне много строк кода, которые я сам просматривал граф объектов. - person Daniel Brückner; 18.11.2009
comment
Есть ошибка, посмотрите: stackoverflow.com/questions/1757872/ - person Shimmy Weitzhandler; 22.11.2009
comment
Иногда вам нужно обновить даже неизмененные элементы, потому что вы хотите обновить их в соответствии с изменениями, внесенными в базу данных другими клиентами. - person Shimmy Weitzhandler; 26.11.2009
comment
@Shimmy GetObjectStateEntries() требует параметр (например, Modified), и когда я передаю его, я получаю исключение, что объект отключен от контекста. Любые идеи? - person Sam Selikoff; 13.01.2014

Вы можете использовать этот код:

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

Я написал сообщение о том, как RefreshAll() и обновить контекст другими способами:

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

person Christian Rodriguez    schedule 13.06.2013
comment
Это вызовет исключение, если вы добавили элементы. Добавьте это перед исправлением: var addedEntries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).ToList(); addedEntries.ForEach(entry => entry.Delete()); - person AncientSyntax; 06.03.2015
comment
@AncientSyntax Вы правы насчет исключения. На самом деле, если подумать, не имеет смысла пытаться обновить только что добавленный объект. Я отредактировал ответ, удалив EntityState.Added из кода. В предлагаемом вами решении вы фактически удаляете только что добавленный объект, поэтому ничего не будет добавлено. - person Christian Rodriguez; 20.07.2015
comment
Связано ли это с версией SQL, поэтому она работает при работе на сервере SQL 12.0, но 11.0? - person jcubero; 30.03.2016

Если вы хотите сбросить ВСЕ изменения, вы можете установить для ObjectContext значение null и повторно создать его экземпляр.

Я верю, что это достигнет того, чего вы хотите.

Доброта,

Дэн

person Daniel Elliott    schedule 17.11.2009
comment
Я предполагаю, что вы работаете с ASP.NET, поэтому вам легко это сказать, я использую экземпляр контекста с длинным жизненным циклом. - person Shimmy Weitzhandler; 07.10.2010

Мы используем это:

return Context.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Deleted
System.Data.EntityState.Modified).All(ose 
  => {
    if(ose.Entity != null)
      Context.Refresh(RefreshMode.StoreWins, ose.Entity);
      return true;
    });

Где «Контекст» — это контекст для обновления. Мы фильтруем по состоянию изменения и сущностям, чтобы избежать появления новых сущностей и отношений.

person GBrian    schedule 01.12.2010