Правильное присоединение и отсоединение сущностей от контекста в EF4.1

Я пытаюсь реализовать механизм кеширования для сущностей. И чтобы использовать сущности правильно и без проблем с кешированием, мне нужно отсоединить сущность от текущего контекста, прежде чем я помещу ее в кеш, и прикреплю обратно к новому контексту, когда я получу его из кеша. (Время жизни моего контекста зависит от http-запроса)

Требования заключаются в том, что -

  1. Все связанные с ним свойства навигации (которые я уже заполнил) не должны удаляться при отсоединении объекта.
  2. Я могу обновить кешированные элементы, если захочу (поэтому важно правильно прикрепить их к новому контексту).

Это моя попытка создать класс EntityCache - (ServerCache - это мой класс-оболочка, который помещает объект в кеш ASP.NET)

public static class EntityCache
    {
        private static DbContext context
        {
            get
            {
                return (DbContext)HttpContext.Current.Items[ObjectKeys.ContextRequestItemKey];
            }
        }

        private static void Detach(object entity)
        {
            var trackedEntity = entity as IEntityWithChangeTracker;
            trackedEntity.SetChangeTracker(null);
            ((IObjectContextAdapter)context).ObjectContext.Detach(entity);
        }

        private static void Attach(object entity)
        {
            ((IObjectContextAdapter)context).ObjectContext.Attach((IEntityWithKey)entity);
        }

        public static void Remove(string key)
        {
            ServerCache.Remove(key);
        }

        public static object Get(string key)
        {
            object output = ServerCache.Get(key);
            if (output != null)
                Attach(output);
            return output;
        }

        public static void ShortCache(String key, object data)
        {
            if (data != null)
            {
                Detach(data);
                ServerCache.ShortCache(key, data);
            }
        }

        public static void LongCache(String key, object data)
        {
            if (data != null)
            {
                Detach(data);
                ServerCache.LongCache(key, data);
            }
        }
    }

Когда я помещаю объект в кеш, он имеет тип DynamicProxy, а НЕ настоящий класс.

Присоединение вообще не работает - я получаю исключение, что я не могу связать объект типа Dynamic_ {blahblah} с IEntityWithKey.

Я только что видел эти примеры присоединения и отсоединения в Интернете и пробовал их, я открыт для любой новой реализации методов присоединения / отсоединения здесь.

Спасибо.

Дополнительный вопрос -

context.Entry(entity).State = EntityState.Detached;

Работает, но делает все загружаемые навигационные свойства NULL, как сделать так, чтобы они сохраняли навигационные свойства и НЕ заменяли (или не теряли) их на NULL, когда мы отключаемся от контекста.

31
задан MoXplod 7 October 2011 в 19:29
поделиться