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

У меня есть LINQ Query, который возвращает один объект - контекст является 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());
}

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);
}
Другие вопросы по тегам