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

对象标识

  • 运行库中的对象具备惟一标识。引用同一对象的两个变量其实是引用此对象的同一实例。你更改一个变量后,能够经过另外一个变量看到这些更改。
  • 关系数据库表中的行不具备惟一标识。因为每一行都具备惟一的主键,所以任何两行都不会共用同一键值。

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

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

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

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

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

对象缓存

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

Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");

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

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;