木子屋 Dnawo's BLOG

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

👤 dnawo 📅 2012-08-24 👁 5155 👍 0 💬 0 🔄 来源:本站原创
在《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[color=Red].ToList()[/color];
                Console.WriteLine(((List<Categories>)container["categories"]).First().CategoryName);
            }

            Console.ReadKey();
        }
    }
}

评论(0)

暂无评论。

验证码
评论需审核通过后显示
← 上一篇 SQL Server2005:找不到指定的模块(MS Visua… 下一篇 → 中国农业银行K宝密码修改示例