我正在try 实现实体的缓存机制.为了正确且无缝地将实体与缓存一起使用,我需要在将实体放入缓存之前将其从当前上下文中分离出来,并在从缓存中获取新上下文时将其附加回新上下文.(我的上下文生存期是针对每个http请求的)
有关规定是-
- 分离实体时,不应删除与其关联的所有导航属性(我已经填充了这些属性).
- 如果需要,我可以更新缓存的项目(因此正确地将它们附加到新上下文非常重要).
这是我try 创建一个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}to IEntityWithKey的对象大小写为case.
我刚刚在网上看到了这些attach和detach的示例,并try 了它们,我对这里attach/detach方法的任何新实现都持开放态度.
谢谢.
跟进问题-
context.Entry(entity).State = EntityState.Detached;
工作,但是使所有加载的导航属性都为空,那么当我们从上下文中分离时,如何使它保留导航属性而不用空替换(或丢失)它们呢?