首页 / 软件开发 / LINQ / LINQ to SQL语句(16)之对象标识
LINQ to SQL语句(16)之对象标识2010-12-11 博客园 李永京对象标识运行库中的对象具有唯一标识。引用同一对象的两个变量实际上 是引用此对象的同一实例。你更改一个变量后,可以通过另一个变量看到这些更 改。关系数据库表中的行不具有唯一标识。由于每一行都具有唯一的主 键,因此任何两行都不会共用同一键值。实际上,通常我们是将数据从 数据库中提取出来放入另一层中,应用程序在该层对数据进行处理。这就是 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;