Entity Framework延时执行导致缓存失效解决方法

在《Entity Framework 4.3简单使用示例》的基础上,希望能对数据进行缓存,写了个示例:

using System;
using System.Collections;
using System.Data.Entity;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        //缓存容器
        static Hashtable container = new Hashtable();

        static void Main(string[] args)
        {
            CAContext context = new CAContext();            

            for (int i = 1; i <= 3; i++)
            {
                if (!container.Contains("categories"))
                    container["categories"] = context.Categories;
                Console.WriteLine(((DbSet<Categories>)container["categories"]).First().CategoryName);
            }

            Console.ReadKey();
        }
    }
}

但通过观察SQL Server Profiler发现:缓存是失败的,实际对数据库进行了3次查询:



什么原因呢?联想到Linq的延时执行,猜测EntityFramework也有这种特性?将示例代码稍做了修改:

for (int i = 1; i <= 3; i++)
{
    if (!container.Contains("categories"))
        container["categories"] = context.Categories;
    Console.WriteLine(i);
}

果然,SQL Server Profiler显示没有执行任何查询:



参考Linq强制立即执行的方法,最终代码修改如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        //缓存容器
        static Hashtable container = new Hashtable();

        static void Main(string[] args)
        {
            CAContext context = new CAContext();            

            for (int i = 1; i <= 3; i++)
            {
                if (!container.Contains("categories"))
                    container["categories"] = context.Categories.ToList();
                Console.WriteLine(((List<Categories>)container["categories"]).First().CategoryName);
            }

            Console.ReadKey();
        }
    }
}


评论: 0 | 引用: 0 | 查看次数: 4688
发表评论
登录后再发表评论!