Обновление контекста объекта 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);
}