2

У меня есть LINQ запрос, который возвращает один объект - контекст является ObjectContext не DbContextEntity Framework контекст объекта Обновить

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

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

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

context.Refresh(RefreshMode.StoreWins, y); 

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

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

Я понимаю, что с контекстом DB вы можете обновите объект, заставляющий обновление базы данных, мой вопрос заключается в том, можно ли принудительно обновить с помощью 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()); 
} 
+0

Вы пробовали это? 'context.Entry (y) .Reload();' – lokusking

+0

objectcontext не имеет метода записи http://stackoverflow.com/questions/11032683/objectcontext-does-not-contain-a-definition-for-entry-and -no-extension-metho – Chris

+0

Вы правы. Я смотрю через пару часов, когда у меня есть доступ к моему EF-проекту. – lokusking

ответ

0

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

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

это работает в некоторых наших случаях, в частности где это не работает, устанавливается отношение к null, это не обновит его. Я буду отмечать как ответ, однако он еще неполный. – Chris

+1

Возможно, dont установить отношение к null. Вместо этого очистите их или удалите элемент. Установка 'IEnumerable' на' null' никогда не является хорошей идеей. – lokusking

+0

награжден бонусом, мы попытаемся исправить дополнительные проблемы, спасибо, chris – Chris

 Смежные вопросы

  • Нет связанных вопросов^_^