对象标识
运行库中的对象具有唯一标识。引用同一对象的两个变量实际上 是引用此对象的同一实例。你更改一个变量后,可以通过另一个变量看到这些更 改。
关系数据库表中的行不具有唯一标识。由于每一行都具有唯一的主 键,因此任何两行都不会共用同一键值。
实际上,通常我们是将数据从数据库中提取出来放入另一层中,应用程序在该层对数据进行处理。这就是 LINQ to SQL 支持的模型。将数据作为行从数据库中提取出来时,你不期望表示 相同数据的两行实际上对应于相同的行实例。如果您查询特定客户两次,您将获 得两行数据。每一行包含相同的信息。
对于对象。你期望在你反复向 DataContext 索取相同的信息时,它实际上会为你提供同一对象实例。你将它们 设计为层次结构或关系图。你希望像检索实物一样检索它们,而不希望仅仅因为 你多次索要同一内容而收到大量的复制实例。
在 LINQ to SQL 中, DataContext 管理对象标识。只要你从数据库中检索新行,该行就会由其主键记 录到标识表中,并且会创建一个新的对象。只要您检索该行,就会将原始对象实 例传递回应用程序。通过这种方式,DataContext 将数据库看到的标识(即主键 )的概念转换成相应语言看到的标识(即实例)的概念。应用程序只看到处于第 一次检索时的状态的对象。新数据如果不同,则会被丢弃。
LINQ to SQL 使用此方法来管理本地对象的完整性,以支持开放式更新。由于在最初创建对象 后唯一发生的更改是由应用程序做出的,因此应用程序的意向是很明确的。如果 在中间阶段外部某一方做了更改,则在调用 SubmitChanges() 时会识别出这些 更改。
以上来自MSDN,的确,看了有点“正规”,下面我用 两个例子说明一下。
对象缓存
在第一个示例中,如果我们执行同一查 询两次,则每次都会收到对内存中同一对象的引用。很明显,cust1和cust2是同 一个对象引用。
Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");
下面的示例中,如果您执行返回数据库中同一 行的不同查询,则您每次都会收到对内存中同一对象的引用。cust1和cust2是同 一个对象引用,但是数据库查询了两次。
Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = (
from o in db.Orders
where o.Customer.CustomerID == "BONAP"
select o )
.First()
.Customer;