什么是主键缓存?

Magichi 2010-07-08 05:26:45
主键缓存

Linq to sql对查询过的对象进行缓存,之后的如果只根据主键查询一条记录的话会直接从缓存中读取。比如下面的代码:

Customer c1 = ctx.Customers.Single(customer => customer.CustomerID == "ANATR");
c1.ContactName = "zhuye";
Customer c2 = ctx.Customers.Single(customer => customer.CustomerID == "ANATR");
Response.Write(c2.ContactName);

由于没有提交修改,所以数据库中的记录还是没有更新。由于这个特性,我们在使用存储过程作为实体更新方法的时候就要当心了,存储过程书写错误,即使你提交了修改也很可能导致缓存中的数据和数据库中的数据不一致,引起不必要的麻烦。





以上是书中内容,语句都看得懂,问题是什么是主键缓存?
...全文
126 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
所以我认为你这本书的作者可能比较浮、过于堆砌和拼凑表面文章。这本书最好只作为偶尔参考,千万不要太认真。
  • 打赏
  • 举报
回复
如果你在第二行之后插入一条语句保证将数据更新到数据库,还能是这个结果吗?

我没有使用过你的Linq Provider(貌似linq to sql?),不过很明显使用任何linq provider的代码,如果你将c1的值修改,而不保存到数据库,然后重新从数据库查询,都理当应该是返回数据库中的旧值。
  • 打赏
  • 举报
回复
跟查询或者加载没有关系。当你更新了数据,不执行一句将数据更新到数据库的指令吗?

如果你不直接将数据保存到数据库,那么从ctx查询,当然人家要首先看看要查询的数据是不是已经取到内存中的数据,如果是就不需要去查询数据库而直接把内存中的数据返回给你就行了。

缓存单元是根据 CustomerID 字段值作为索引的,要看看内存中有没有对应的数据就是依据它来比较。为什么用这个值作为索引?因为它是你在实体上声明的主键。


至于你的这本书,纯粹是为了举例而举例。修改了数据而不保存,这种例子使用一个故意制造的逻辑bug来说明其它的道理?这种写书方法是误人子弟的。
哥子谭 2010-08-28
  • 打赏
  • 举报
回复
延迟加载数据
Magichi 2010-07-12
  • 打赏
  • 举报
回复
我知道是延迟查询,但问题是为什么说是主键缓存?书中前面已经写过了延迟查询,所以我想主键缓存应该是另外一个东西
q107770540 2010-07-09
  • 打赏
  • 举报
回复
所谓主键缓存,
说的应该是linq的延迟查询吧

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧