C# 缓存方面中的实体框架实体
我正在尝试缓存从存储库返回的实体。我正在拦截对存储库方法的调用,以便检查请求的数据是否存在于缓存中。 但是,因为我截取了方法调用,所以我无法获得真正的实体类型,因为您可能会猜到我得到的是EF代理类型。所以当我把它放到缓存中时,我并没有把真正的实体放到缓存中,而是把它的一个子类放到缓存中 我记得Nhibernate有一些工具可以立即初始化代理。我们能在EF 6中完成吗?我如何在这里获取基础实体 这里是我的一些代码,以澄清我的需要。顺便说一下,我用的是城堡拦截器C# 缓存方面中的实体框架实体,c#,entity-framework,caching,interception,C#,Entity Framework,Caching,Interception,我正在尝试缓存从存储库返回的实体。我正在拦截对存储库方法的调用,以便检查请求的数据是否存在于缓存中。 但是,因为我截取了方法调用,所以我无法获得真正的实体类型,因为您可能会猜到我得到的是EF代理类型。所以当我把它放到缓存中时,我并没有把真正的实体放到缓存中,而是把它的一个子类放到缓存中 我记得Nhibernate有一些工具可以立即初始化代理。我们能在EF 6中完成吗?我如何在这里获取基础实体 这里是我的一些代码,以澄清我的需要。顺便说一下,我用的是城堡拦截器 public class Cache
public class CacheInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (IsReturnTypeCacheable(invocation.Method.ReturnType))
{
string cacheKey = this.CreateCacheKey(invocation.Method.Name, invocation.Arguments);
object returnValue = this.GetFromCache<object>(cacheKey);
if (returnValue != null)
{
invocation.ReturnValue = returnValue;
return;
}
else
{
invocation.Proceed();
object actualValue = invocation.ReturnValue;
Type proxyType = invocation.ReturnValue.GetType();
Type pocoType = proxyType.BaseType;
var dataInstance = Activator.CreateInstance(pocoType);
dataInstance = invocation.ReturnValue;
this.PutToCache(cacheKey, dataInstance);// This puts the proxy type to cache, not underlying POCO...
}
}
else
{
invocation.Proceed();
}
}
private bool IsReturnTypeCacheable(Type type)
{
//some custom checks
}
public T GetFromCache<T>(string cacheKey) where T : class
{
IRedisNativeClient redisClient = new RedisNativeClient("myredis");
byte[] obj = redisClient.Get(cacheKey);
if (obj == null) return null;
return Serializer.Deserialize<T>(obj);
}
public void PutToCache(string cacheKey, object value)
{
if (value == null) return;
IRedisNativeClient redisClient = new RedisNativeClient("myredis");
redisClient.Set(cacheKey, Serializer.Serialize(value));
}
public string CreateCacheKey(string method, object[] arguments)
{
//creates cache key
}
}
如果实体类满足创建代理的条件,则创建代理。顺便说一句,我不明白为什么每次方法调用都要缓存实体。现在,每个方法调用都可能获得不同的实体实例。我不认为这是缓存的概念。我只想做与DbSet.Create相反的事情。我想从给定的代理创建实体。关于每个方法调用的缓存,我想不出更好的办法。我查找了EF 6的二级缓存。但我什么也找不到。我没有在这里缓存所有的方法,我还有一个过滤器。我只缓存类似目录的数据,不接触事务数据。另一种方法是不可能的,因为代理继承了基类型,它不以任何方式包含该类型。因此,您需要知道基本类型,才能转换代理鸡蛋问题的编译时类型。至于缓存,您看到了吗:,或者:我知道Jaroslaw Kowalski的缓存提供程序,但它似乎很旧。它使用ObjectContext。它可以与Ef6一起使用吗?