Linq to SQL内置缓存功能简单的说当你查询了一次某个键的数据后再次查询时Linq to SQL的引擎不再向数据库发送SQL例如
//下面是使用LinQ to SQL 的例子context是派生自SystemDataLinqDataContext的实例
ErpLinQContextDataContext context = new ErpLinQContextDataContext();
//SQLServer事件探查器拦截到SQL语句的执行
//exec sp_executesql NSELECT TOP [t][emp_id] [t][fname]
[t][minit] [t][lname]
// [t][job_id] [t][job_lvl]
[t][pub_id] [t][hire_date]
//FROM [dbo][employee] AS [t]
//WHERE [t][emp_id] = @p N@p varchar() @p = PMAM
employee p = contextemployeesFirst(p => pemp_id == PMAM);//当我再次执行相同的查询时LinQ to SQL 不再向SQL Server发送查询了
employee p = contextemployeesFirst(p => pemp_id == PMAM);
而且这两个实例是同一个实例
//返回的对象是同一个实例
bool b = objectReferenceEquals(p p); //=true;
plname = New Last Name;
bool b = (plname == New Last Name); //=true;
当然如果你使用不同的Context实例查询时缓存功能将实效
好让我们再看看ADONET Entity Framework beta
//pubsEntites是 ADONET Entity Framework 的SystemDataObjectsObjectContext派生对象
pubsEntities context = new pubsEntities();
//下面语句执行时SQLServer事件探查器拦截到SQL的执行
//SELECT TOP [Extent][emp_id] AS [emp_id] [Extent][fname] AS [fname]
[Extent][lname] AS [lname]
// [Extent][hire_date] AS [hire_date] [Extent][job_id] AS
[job_id] [Extent][pub_id] AS [pub_id]
//FROM [dbo][employee] AS [Extent]
//WHERE NPMAM = [Extent][emp_id]
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);
//SQLServer事件探查器 发现SQL再次被执行
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);//测试发现虽然ADONET Entity Framework执行了两次SQL但是他们却返回了完全相同的实例
bool b = objectReferenceEquals(p p); // = true;
测试的结果是ADONET Entity Framework(以下简称AEF)没有使用缓存而是再次执行SQL但是你要注意两次查询的实例竟然是同一个
从Context功能上看他肯定持有上次查询的结果他没有使用缓存我只能认为可能AEF被设计成三层应用那么他很担心其他的进程将数据改了所以不使用缓存当发现数据并没有改后还是使用原先的实例这个想法对吗?
我们再看看另外一个代码
//如果使用不同的上下文更新的数据
pubsEntities context = new pubsEntities();
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);pLastName = Context changed data;
contextSaveChanges();
//旧的context再次查询时
Employee p = contextEmployeeSetFirst(p => pEmployeeId == PMAM);b = objectReferenceEquals(p p); //= true why??
b = (pLastName == Context changed data); //= false
pLastName = New Last Name
难以置信AEF重新执行了SQL但是置新的更改而不闻仍然返回旧的数据这个算是Bug吗?
我不知道哪位达人能够解释这个问题?当然这个问题我也询问了MS他们的技术人员还未做出满意的答复