Обновление контекста объекта Entity Framework

У меня есть запрос LINQ, который возвращает один объект — контекст представляет собой ObjectContext, а не DbContext.

var q = from c in context.x //this has various includes but this just an example
where c.Id == xId
select c;

X x = q.FirstOrDefault();

Затем я присоединяю к этому коллекцию, используя следующие

ObjectQuery<Z> y = x.Y.CreateSourceQuery().Include("1").Include("2");
x.Y.Attach(y);

Однако есть проблема, когда я пытаюсь обновить загруженный объект, и если какие-либо элементы, прикрепленные к исходному запросу, были удалены, они не меняются при обновлении. Я считаю, что это связано с тем, что контекст загружает каждый объект только один раз и сохраняет его в кэше, однако я нужно держать контекст открытым, так как мне нужно сохранить обратно в базу данных.

Я попытался обновить, используя следующее:

context.Refresh(RefreshMode.StoreWins, y);

или инициировать запуск обновления, установив состояние объекта как измененное:

context.ObjectStateManager.ChangeObjectState(pb, EntityState.Modified);

Я понимаю, что с контекстом БД вы можете обновить объект, вызывая обновление базы данных, мой вопрос будет заключаться в том, возможно ли принудительно обновить с помощью ObjectContext.

Используя DbContext, мы смогли получить желаемые результаты, обновив все, однако, как вы понимаете, это было очень медленно.

var refreshableObjects = context.ChangeTracker.Entries().Select(e => e.Entity).ToList();
foreach (var obj in refreshableObjects)
{
    ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetRelationshipManager(obj).GetAllRelatedEnds().Where(r => r.IsLoaded).ToList().ForEach(c => c.Load());
}

person Chris    schedule 08.07.2016    source источник
comment
Вы пробовали это? context.Entry(y).Reload();   -  person lokusking    schedule 11.07.2016
comment
objectcontext не имеет метода ввода «objectcontext не содержит определения для записи и метода расширения»> stackoverflow.com/questions/11032683/   -  person Chris    schedule 11.07.2016
comment
Вы правы. посмотрю через пару часов когда получу доступ к моему EF-Project   -  person lokusking    schedule 11.07.2016
comment
Вы уже видели это?   -  person lokusking    schedule 11.07.2016
comment
У меня нет, я попробую, когда смогу :)   -  person Chris    schedule 12.07.2016
comment
Не могли бы вы взглянуть на это, пожалуйста? Я знаю, что он использовал DbContext, но он может вам помочь, так как описывает улучшенную производительность.   -  person meJustAndrew    schedule 12.07.2016
comment
@meJustAndrew извините, это бесполезно, так как я понимаю, что это просто сделать с DbContext, но у нас нет планов обновлять версию .Net нашей модели.   -  person Chris    schedule 13.07.2016
comment
@lokusking, похоже, это работает, нужно протестировать это, но, надеюсь, оно выдержит, если вы хотите опубликовать его как ответ, чтобы я мог присудить награду, если это уместно :)   -  person Chris    schedule 13.07.2016


Ответы (1)


Согласно этот пост, это может помочь:

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);
}
person lokusking    schedule 13.07.2016
comment
это работает в некоторых наших случаях, в частности, когда это не работает, это установка отношения на ноль, это не обновит его. Я отмечу как ответ, но он все еще неполный. - person Chris; 13.07.2016
comment
Возможно, не устанавливайте отношение равным нулю. Вместо этого очистите их или удалите элемент. Установка IEnumerable на null никогда не была хорошей идеей - person lokusking; 13.07.2016
comment
присуждена награда, мы постараемся исправить дополнительные проблемы, спасибо, Крис - person Chris; 13.07.2016