C# 缓存方面中的实体框架实体

C# 缓存方面中的实体框架实体,c#,entity-framework,caching,interception,C#,Entity Framework,Caching,Interception,我正在尝试缓存从存储库返回的实体。我正在拦截对存储库方法的调用,以便检查请求的数据是否存在于缓存中。 但是,因为我截取了方法调用,所以我无法获得真正的实体类型,因为您可能会猜到我得到的是EF代理类型。所以当我把它放到缓存中时,我并没有把真正的实体放到缓存中,而是把它的一个子类放到缓存中 我记得Nhibernate有一些工具可以立即初始化代理。我们能在EF 6中完成吗?我如何在这里获取基础实体 这里是我的一些代码,以澄清我的需要。顺便说一下,我用的是城堡拦截器 public class Cache

我正在尝试缓存从存储库返回的实体。我正在拦截对存储库方法的调用,以便检查请求的数据是否存在于缓存中。 但是,因为我截取了方法调用,所以我无法获得真正的实体类型,因为您可能会猜到我得到的是EF代理类型。所以当我把它放到缓存中时,我并没有把真正的实体放到缓存中,而是把它的一个子类放到缓存中

我记得Nhibernate有一些工具可以立即初始化代理。我们能在EF 6中完成吗?我如何在这里获取基础实体

这里是我的一些代码,以澄清我的需要。顺便说一下,我用的是城堡拦截器

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一起使用吗?