主键缓存

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);

执行后只会产生一条SQL:

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]

FROM [dbo].[Customers] AS [t0]

WHERE [t0].[CustomerID] = @p0

-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [ANATR]

由于没有提交修改,所以数据库中的记录还是没有更新。由于这个特性,我们在使用存储过程作为实体更新方法

的时候就要当心了,存储过程书写错误,即使你提交了修改也很可能导致缓存中的数据和数据库中的数据不一致,

引起不必要的麻烦。

DataContext隔离

有的时候我们会把对象从外部传入DataContext,要求它更新,由于不同的DataContext是相对独立的。

由于新的DataContext中还没有获取实体,我们只能通过附加方式更新数据。

首先把Customer表的主键字段加上IsVersion标识:

[Column(Storage="_CustomerID", DbType="NChar(5) NOT NULL", CanBeNull=false, IsPrimaryKey=true, IsVersion = true)]

运行下面的测试代码:

Customer c = new Customer { CustomerID = "ALFKI", ContactName = "zhuye", CompanyName = "1111" };

ctx.Customers.Attach(c, true);

ctx.SubmitChanges();

会捕捉到下面的SQL语句:

UPDATE [dbo].[Customers]

SET [CompanyName] = @p2, [ContactName] = @p3, [ContactTitle] = @p4, [Address] = @p5, [City] = @p6, [Region] = @p7, [PostalCode] = @p8, [Country] = @p9, [Phone] = @p10, [Fax] = @p11

WHERE ([CustomerID] = @p0) AND ([CustomerID] = @p1)

-- @p0: Input StringFixedLength (Size = 5; Prec = 0; Scale = 0) [ALFKI]

-- @p1: Input String (Size = 5; Prec = 0; Scale = 0) [ALFKI]

-- @p2: Input String (Size = 4; Prec = 0; Scale = 0) [1111]

-- @p3: Input String (Size = 5; Prec = 0; Scale = 0) [zhuye]

-- @p4: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p5: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p6: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p7: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p8: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p9: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p10: Input String (Size = 0; Prec = 0; Scale = 0) []

-- @p11: Input String (Size = 0; Prec = 0; Scale = 0) []

今天就到这里,下次讲并发与事务问题。

转载于:https://www.cnblogs.com/kevin2013/archive/2010/06/01/1749056.html

Linq to sql(六):探究特性(四)相关推荐

  1. ScottGu之博客翻译-LINQ to SQL第四部分,更新数据库 LINQ to SQL (Part 4 - Updating our Database)...

    原贴链接: http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.asp ...

  2. Linq To Sql进阶系列 -目录导航

    博客园CLR基础研究团队|CLR团队精品系列|C# 3.0专题 [Linq To Sql进阶系列] 目录导航 1 Linq To Sql进阶系列(一)-从映射讲起 本系列,或多或少,直接或间接依赖入门 ...

  3. Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别

    在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询.本文在上文的基础上,再做更加深入的引申.同时修正上文中一些不妥的地方. 1, object的动态查询续 首先 ...

  4. 一步一步学Linq to sql(六):探究特性

      延迟执行 IQueryable query = from c in ctx.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL.仅仅在需要 ...

  5. FreeSql (二十四)Linq To Sql 语法使用介绍

    原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法 ...

  6. 一步一步学linq to sql(四)查询句法

    select 描述:查询顾客的公司名.地址信息 查询句法: var 构建匿名类型1 = from c in ctx.Customers select new { 公司名 = c.CompanyName ...

  7. LINQ To SQL 语法及实例大全

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  8. LINQ to SQL语句(1)之Where(抄的好)

    Where操作适用场景:实现过滤,查询等功能.说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操作包括3种形式,分别为简单形式.关 ...

  9. LINQ to SQL语句 收藏系列

    KB-Transaction in Linq to SQL  http://blog.darkthread.net/post-2008-05-14-transaction-in-linq-to-sql ...

  10. C# LINQ TO SQL

    LINQ to SQL语句(1)之Where   Where操作   适用场景:实现过滤,查询等功能.   说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它 ...

最新文章

  1. 用SAPI实现Speech Recognition(SR) - 听写模式
  2. 【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap区别
  3. Linux上利用NFS实现远程挂载
  4. SpringBoot番外篇-微服务架构【1.起源与定义】
  5. python while true循环_python学习——while True的用法
  6. 电脑小白快来!这有电脑常见故障解决方法
  7. inventor 波纹阵列_Inventor装配零部件阵列功能详解
  8. 超级小白的AOP之Springboot 日志工程
  9. RTK ST5113-53 3kN 220VAC
  10. 男人怎么读 萨瓦迪卡!还是萨瓦迪卡不!
  11. JS修改style样式
  12. 华为设备DHCP配置命令
  13. KubeVirt with YRCloudFile 擦出创新的火花
  14. 【自学前端】我只学这些够吗?好难
  15. 达人评测 rtx3050ti和gtx1650ti哪个好 3050ti和1650ti对比差多少
  16. 如何实现报表的动态列展现效果
  17. 火狐切换国外账户_如何删除您的Firefox帐户
  18. 【山东事业编】公共基础知识备考——中国的地势和地形
  19. MPS——首款 消费类 PD 协议芯片:MP5031
  20. 下班后如何进行自我提升?掌握这六种技能,你的人生会从此开挂

热门文章

  1. springboot + redis(单机版)
  2. es6.2.4-ansible部署
  3. Chrome网页性能分析工具
  4. ARM:让Mali带来更极致的移动VR体验
  5. 工业互联网网络安全防护亟待提高
  6. TCP建立连接的三次握手过程
  7. Oracle 学习之RMAN(四)增量备份
  8. 易语言写的一个去广告小软件
  9. Linux下安装并启动MongoDB
  10. Eclipse颜色主题插件-Eclipse Color Theme