Linq DataContext浅谈

开发 后端
这里介绍把对象从外部传入Linq DataContext,要求它更新,由于不同的Linq DataContext是相对独立的。由于新的Linq DataContext中还没有获取实体,我们只能通过附加方式更新数据。

本文向大家介绍Linq DataContext,可能好多人还不了解Linq DataContext,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

主键缓存

Linq to sql对查询过的对象进行缓存,之后的如果只根据主键查询一条记录的话会直接从缓存中读取。比如下面的代码:

  1. Customer c1 = ctx.Customers.Single(customer => customer.CustomerID == "ANATR");  
  2. c1.ContactName = "zhuye";  
  3. Customer c2 = ctx.Customers.Single(customer => customer.CustomerID == "ANATR");  
  4.  
  5. Response.Write(c2.ContactName); 

执行后只会产生一条SQL:

  1. SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].
    [ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].
    [PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]  
  2.  
  3. FROM [dbo].[Customers] AS [t0]  
  4.  
  5. WHERE [t0].[CustomerID] = @p0  
  6. -- @p0: Input String (Size = 5Prec = 0Scale = 0) [ANATR] 

由于没有提交修改,所以数据库中的记录还是没有更新。由于这个特性,我们在使用存储过程作为实体更新方法的时候就要当心了,存储过程书写错误,即使你提交了修改也很可能导致缓存中的数据和数据库中的数据不一致,引起不必要的麻烦。

Linq DataContext隔离

有的时候我们会把对象从外部传入Linq DataContext,要求它更新,由于不同的Linq DataContext是相对独立的。由于新的Linq DataContext中还没有获取实体,我们只能通过附加方式更新数据。

首先把Customer表的主键字段加上IsVersion标识:

  1. [Column(Storage="_CustomerID"DbType="NChar(5) NOT NULL"
    CanBeNull=falseIsPrimaryKey=trueIsVersion = true)] 

运行下面的测试代码:

  1. Customer c = new Customer { CustomerID = "ALFKI"
    ContactName = "zhuye"CompanyName = "1111" };  
  2.  
  3. ctx.Customers.Attach(c, true);  
  4. ctx.SubmitChanges(); 

会捕捉到下面的SQL语句:

  1. UPDATE [dbo].[Customers]  
  2. SET [CompanyName] = @p2, [ContactName] = @p3, [ContactTitle] = @p4, 
    [Address] = @p5, [City] = @p6, [Region] = @p7, [PostalCode] = @p8, 
    [Country] = @p9, [Phone] = @p10, [Fax] = @p11  
  3. WHERE ([CustomerID] = @p0) AND ([CustomerID] = @p1)  
  4. -- @p0: Input StringFixedLength (Size = 5Prec = 0Scale = 0) [ALFKI]  
  5. -- @p1: Input String (Size = 5Prec = 0Scale = 0) [ALFKI]  
  6. -- @p2: Input String (Size = 4Prec = 0Scale = 0) [1111]  
  7. -- @p3: Input String (Size = 5Prec = 0Scale = 0) [zhuye]  
  8. -- @p4: Input String (Size = 0Prec = 0Scale = 0) []  
  9. -- @p5: Input String (Size = 0Prec = 0Scale = 0) []  
  10. -- @p6: Input String (Size = 0Prec = 0Scale = 0) []  
  11. -- @p7: Input String (Size = 0Prec = 0Scale = 0) []  
  12. -- @p8: Input String (Size = 0Prec = 0Scale = 0) []  
  13. -- @p9: Input String (Size = 0Prec = 0Scale = 0) []  
  14. -- @p10: Input String (Size = 0Prec = 0Scale = 0) []  
  15. -- @p11: Input String (Size = 0Prec = 0Scale = 0) [] 

【编辑推荐】

  1. Linq结果集形状概述
  2. Linq存储过程返回详解
  3. Linq调用LoadProducts方法
  4. Linq使用数据表简单描述
  5. Linq对象引用简单介绍
责任编辑:佚名 来源: IT168
相关推荐

2009-09-08 14:56:55

强类型DataContLinq to SQL

2009-09-15 13:20:34

LINQ DataCo

2009-09-18 15:22:14

DataContextLINQ to SQL

2009-09-15 16:31:15

LINQ Custom

2009-09-08 15:19:52

Linq Where操

2009-09-16 11:15:52

Linq联接数据

2009-09-14 09:49:08

Linq扩展函数

2009-09-07 17:32:14

LINQ检索数据

2009-09-11 11:25:35

LINQ函数集合

2009-09-10 11:29:00

LINQ to SQL

2009-09-10 15:45:07

Linq使用Selec

2009-09-14 13:30:04

Linq数据和对象

2009-09-08 16:55:01

Linq实现XML转换

2009-09-15 11:08:01

LinQ调用存储过程

2009-09-14 15:45:28

LINQ删除XML节点

2009-06-18 10:07:44

LINQ to ACC

2009-09-18 16:32:51

Linq委托实例化

2009-09-09 11:07:52

LINQ to SQL

2009-09-09 13:01:33

LINQ Lambda

2009-06-15 17:45:20

LINQ分组统计
点赞
收藏

51CTO技术栈公众号