Как отделить граф объекта от контекста объекта в Entity Framework без обращения к базе данных? - PullRequest
2 голосов
/ 24 ноября 2011

Рабочий процесс моего приложения довольно прост:

Для данной связки скриптов

  1. взять сценарий
  2. разобрать
  3. получить соответствующий граф объекта из db
  4. обновить или создать новый, если граф не найден
  5. сохранить изменения
  6. отсоединение графа от контекста объекта для GC может убить граф

Последний элемент списка не нужен, если для каждого скрипта создается контекст объекта, но он влияет на производительность, более того, я хочу, чтобы некоторые сущности сохранялись в контексте, а другие собирались GC.

Я думал о ручном отсоединении сущностей:

foreach (var desc in component.Descriptions)
   context.ComponentDescription.Detach(desc);
context.Components.Detach(component);

Такое перечисление подразумевает db-запросы в случае включенной отложенной загрузки. Это совсем не хорошо.

Я нашел такой способ, как взломать:

var entities = context.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged).Where(
                        e => !(e.Entity is ComponentType));
entities.Iterate(e => e.ChangeState(EntityState.Detached));

Ну, это не отрыв графика, но я просто знаю, что могу сделать это в моем случае. Но что, если мне нужно работать с определенным графиком, как я могу отсоединить связанные свойства, не беспокоясь о БД?

1 Ответ

2 голосов
/ 24 ноября 2011

Поскольку ваш вопрос, проблема в том, чтобы позвонить на component.Descriptions, потому что это вызывает отложенную загрузку, если описания не загружены. Так что решение должно быть простым. Временно отключите отложенную загрузку во время этой операции.

context.ContextOptions.LazyLoadingEnabled = false;

foreach (var desc in component.Descriptions)
   context.ComponentDescription.Detach(desc);
context.Components.Detach(component);

context.ContextOptions.LazyLoadingEnabled = true;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...