2010-10-20 2 views
3

Я работаю в отключенном сценарии, но заметил, что удаление контекста объекта не освобождает прикрепленные объекты. В результате последующие операции часто терпят неудачу из-за этого.Entity framework: отключение, но хранение графа объектов

Так решить эту проблему, я отсоединять все сам, когда контекст объекта расположены:

public void Dispose() 
{ 
    // detaching is not really needed, because we have short living object contexts 
    var objectStateEntries = 
     _context.UnderlyingContext.ObjectStateManager.GetObjectStateEntries(EntityState.Unchanged);   
    objectStateEntries.ToList().ForEach(o => { if (o.Entity != null) 
    {     
    _context.UnderlyingContext.Detach(o.Entity);    
    }});    

    _context.Dispose(); 
    _context = null;  
} 

Однако побочным эффектом является то, что объектный граф получает отдельностоящий полностью, но я действительно хочу, чтобы сохранить график !

Кажется, я не нашел для этого решения, верно ли, что это невозможно?

+0

Можете ли вы объяснить эту проблему лучше, мне кажется, никто из этого не должно быть необходимым. Как возникают «не выпущенные» объекты? –

+0

Ну, предположим, что я создаю сложный объект в отключенном клиенте, отправьте его во внутреннюю часть, которая создает этот объект, используя структуру сущности. Это работает, и обновленный объект отправляется обратно отключенному клиенту. Затем клиент обновляет объект, меняя некоторые свойства, возможно добавляя и удаляя объекты в коллекции. Вернемся к back-end, затем я снова присоединяю то, что нужно, но часто получаю ошибку, что объект уже прикреплен. Но если я попытаюсь проверить это с помощью TryGetObjectStateEntry, это также вызывает исключение, говорящее мне, что это не в контексте! (tbc) –

+0

Итак, кажется, что существует конфликт, потому что я пытаюсь использовать объект, который все еще привязан к предыдущему объекту. Если я сначала отключу этот объект, когда первый контекст будет удален, у меня нет никаких проблем. Поэтому я пришел к выводу, что объект следует всегда отделять, если он будет использоваться в другом контексте. Правда? –

ответ

0

У нас была эта проблема; вы не можете иметь часть графика, привязанную к контексту EF. Рассматривали ли вы загрузку данных изначально в отключенном состоянии? Контекст затем используется как хранилище данных без сохранения данных и ничего другого.

Вы можете загрузить данные в виде первоначально как Хорошие следующим образом:

myDataContext.MyEntitySet.MergeOption = MergeOption.NoTracking;