zoukankan      html  css  js  c++  java
  • Linq to sql(六):探究特性(四)

    主键缓存

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

            Customer c1 = ctx.Customers.Single(customer => customer.CustomerID == "ANATR");

            c1.ContactName = "zhuye";

            Customer c2 = ctx.Customers.Single(customer => customer.CustomerID == "ANATR");

            Response.Write(c2.ContactName);

           执行后只会产生一条SQL

    SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]

    FROM [dbo].[Customers] AS [t0]

    WHERE [t0].[CustomerID] = @p0

    -- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [ANATR]

           由于没有提交修改,所以数据库中的记录还是没有更新。由于这个特性,我们在使用存储过程作为实体更新方法

    的时候就要当心了,存储过程书写错误,即使你提交了修改也很可能导致缓存中的数据和数据库中的数据不一致,

    引起不必要的麻烦。

    DataContext隔离

           有的时候我们会把对象从外部传入DataContext,要求它更新,由于不同的DataContext是相对独立的。

    由于新的DataContext中还没有获取实体,我们只能通过附加方式更新数据。

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

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

           运行下面的测试代码:

            Customer c = new Customer { CustomerID = "ALFKI", ContactName = "zhuye", CompanyName = "1111" };

            ctx.Customers.Attach(c, true);

            ctx.SubmitChanges();

           会捕捉到下面的SQL语句:

    UPDATE [dbo].[Customers]

    SET [CompanyName] = @p2, [ContactName] = @p3, [ContactTitle] = @p4, [Address] = @p5, [City] = @p6, [Region] = @p7, [PostalCode] = @p8, [Country] = @p9, [Phone] = @p10, [Fax] = @p11

    WHERE ([CustomerID] = @p0) AND ([CustomerID] = @p1)

    -- @p0: Input StringFixedLength (Size = 5; Prec = 0; Scale = 0) [ALFKI]

    -- @p1: Input String (Size = 5; Prec = 0; Scale = 0) [ALFKI]

    -- @p2: Input String (Size = 4; Prec = 0; Scale = 0) [1111]

    -- @p3: Input String (Size = 5; Prec = 0; Scale = 0) [zhuye]

    -- @p4: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p5: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p6: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p7: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p8: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p9: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p10: Input String (Size = 0; Prec = 0; Scale = 0) []

    -- @p11: Input String (Size = 0; Prec = 0; Scale = 0) []

    今天就到这里,下次讲并发与事务问题。

  • 相关阅读:
    [转]POI实现读写Excel2007完整示例
    理解maven的核心概念
    关于Unity中Cg的基本语法和使用
    关于Unity中Shader的使用
    关于Unity中坐标系的种类
    关于Unity中Shader的基础认识
    关于Unity中粒子效果的使用
    关于Unity中蒙皮网格和布料的使用
    关于Unity中关节的使用(二)
    关于Unity中关节的使用(一)
  • 原文地址:https://www.cnblogs.com/kevin2013/p/1749056.html
Copyright © 2011-2022 走看看