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