您的位置:知识库 »

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

作者: 李永京  来源: 博客园  发布时间: 2008-09-18 16:55  阅读: 5805 次  推荐: 0   原文链接   [收藏]  
摘要:这个系列的第十六篇,讲解对象标识。

系列文章导航:

LINQ to SQL语句(1)之Where

LINQ to SQL语句(2)之Select/Distinct

LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg

LINQ to SQL语句(4)之Join

LINQ to SQL语句(5)之Order By

LINQ to SQL语句(6)之Group By/Having

LINQ to SQL语句(7)之Exists/In/Any/All/Contains

LINQ to SQL语句(8)之Concat/Union/Intersect/Except

LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods

LINQ to SQL语句(10)之Insert

LINQ to SQL语句(11)之Update

LINQ to SQL语句(12)之Delete和使用Attach

LINQ to SQL语句(13)之开放式并发控制和事务

LINQ to SQL语句(14)之Null语义和DateTime

LINQ to SQL语句(15)之String

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

LINQ to SQL语句(17)之对象加载

LINQ to SQL语句(18)之运算符转换

LINQ to SQL语句(19)之ADO.NET与LINQ to SQL

LINQ to SQL语句(20)之存储过程

LINQ to SQL语句(21)之用户定义函数

LINQ to SQL语句(22)之DataContext

LINQ to SQL语句(23)之动态查询

LINQ to SQL语句(24)之视图

LINQ to SQL语句(25)之继承

LINQ简介

adsfsaf


对象标识

  • 运行库中的对象具有唯一标识。引用同一对象的两个变量实际上是引用此对象的同一实例。你更改一个变量后,可以通过另一个变量看到这些更改。
  • 关系数据库表中的行不具有唯一标识。由于每一行都具有唯一的主键,因此任何两行都不会共用同一键值。

实际上,通常我们是将数据从数据库中提取出来放入另一层中,应用程序在该层对数据进行处理。这就是 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;
0
1
标签:LINQ LINQ to SQL

热门文章

    最新文章

      最新新闻

        热门新闻