LINQ to SQL语句(16)之对象标识

转载地址: http://www.prg-cn.com/article-4444-1.html

对象标识

运行库中的对象具有唯一标识。引用同一对象的两个变量实际上 是引用此对象的同一实例。你更改一个变量后,可以通过另一个变量看到这些更 改。

关系数据库表中的行不具有唯一标识。由于每一行都具有唯一的主 键,因此任何两行都不会共用同一键值。

实际上,通常我们是将数据从 数据库中提取出来放入另一层中,应用程序在该层对数据进行处理。这就是 LINQ to SQL 支持的模型。将数据作为行从数据库中提取出来时,你不期望表示 相同数据的两行实际上对应于相同的行实例。如果您查询特定客户两次,您将获 得两行数据。每一行包含相同的信息。

对于对象。你期望在你反复向 DataContext 索取相同的信息时,它实际上会为你提供同一对象实例。你将它们 设计为层次结构或关系图。你希望像检索实物一样检索它们,而不希望仅仅因为 你多次索要同一内容而收到大量的复制实例。

在 LINQ to SQL 中, DataContext 管理对象标识。只要你从数据库中检索新行,该行就会由其主键记 录到标识表中,并且会创建一个新的对象。只要您检索该行,就会将原始对象实 例传递回应用程序。通过这种方式,DataContext 将数据库看到的标识(即主键 )的概念转换成相应语言看到的标识(即实例)的概念。应用程序只看到处于第 一次检索时的状态的对象。新数据如果不同,则会被丢弃。

LINQ to SQL 使用此方法来管理本地对象的完整性,以支持开放式更新。由于在最初创建对象 后唯一发生的更改是由应用程序做出的,因此应用程序的意向是很明确的。如果 在中间阶段外部某一方做了更改,则在调用 SubmitChanges() 时会识别出这些 更改。

以上来自MSDN,的确,看了有点“正规”,下面我用 两个例子说明一下。

对象缓存

在第一个示例中,如果我们执行同一查 询两次,则每次都会收到对内存中同一对象的引用。很明显,cust1和cust2是同 一个对象引用。

  1. Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
  2. Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");
复制代码

下面的示例中,如果您执行返回数据库中同一 行的不同查询,则您每次都会收到对内存中同一对象的引用。cust1和cust2是同 一个对象引用,但是数据库查询了两次。

  1. Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
  2. Customer cust2 = (
  3.   from o in db.Orders
  4.   where o.Customer.CustomerID == "BONAP"
  5.   select o )
  6.    .First()
  7.   .Customer;
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值