У меня есть запрос 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());
}
context.Entry(y).Reload();
- person lokusking   schedule 11.07.2016