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. 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. FROM [dbo].[Customers] AS [t0]
  3. WHERE [t0].[CustomerID] = @p0
  4. -- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [ANATR]

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

Linq DataContext隔离

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

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

  1. [Column(Storage="_CustomerID", DbType="NChar(5) NOT NULL",
    CanBeNull=false, IsPrimaryKey=true, IsVersion = true)]

运行下面的测试代码:

  1. Customer c = new Customer { CustomerID = "ALFKI",
    ContactName = "zhuye", CompanyName = "1111" };
  2. ctx.Customers.Attach(c, true);
  3. 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 = 5; Prec = 0; Scale = 0) [ALFKI]
    5. -- @p1: Input String (Size = 5; Prec = 0; Scale = 0) [ALFKI]
    6. -- @p2: Input String (Size = 4; Prec = 0; Scale = 0) [1111]
    7. -- @p3: Input String (Size = 5; Prec = 0; Scale = 0) [zhuye]
    8. -- @p4: Input String (Size = 0; Prec = 0; Scale = 0) []
    9. -- @p5: Input String (Size = 0; Prec = 0; Scale = 0) []
    10. -- @p6: Input String (Size = 0; Prec = 0; Scale = 0) []
    11. -- @p7: Input String (Size = 0; Prec = 0; Scale = 0) []
    12. -- @p8: Input String (Size = 0; Prec = 0; Scale = 0) []
    13. -- @p9: Input String (Size = 0; Prec = 0; Scale = 0) []
    14. -- @p10: Input String (Size = 0; Prec = 0; Scale = 0) []
    15. -- @p11: Input String (Size = 0; Prec = 0; Scale = 0) []
posted @ 2012-05-31 18:53  Peter.Luo  阅读(833)  评论(0)    收藏  举报