Linq DataContext淺談
本文向大家介紹Linq DataContext,可能好多人還不了解Linq DataContext,沒(méi)有關(guān)系,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。
主鍵緩存
Linq to sql對(duì)查詢(xún)過(guò)的對(duì)象進(jìn)行緩存,之后的如果只根據(jù)主鍵查詢(xún)一條記錄的話會(huì)直接從緩存中讀取。比如下面的代碼:
- 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);
執(zhí)行后只會(huì)產(chǎn)生一條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]
由于沒(méi)有提交修改,所以數(shù)據(jù)庫(kù)中的記錄還是沒(méi)有更新。由于這個(gè)特性,我們?cè)谑褂么鎯?chǔ)過(guò)程作為實(shí)體更新方法的時(shí)候就要當(dāng)心了,存儲(chǔ)過(guò)程書(shū)寫(xiě)錯(cuò)誤,即使你提交了修改也很可能導(dǎo)致緩存中的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致,引起不必要的麻煩。
Linq DataContext隔離
有的時(shí)候我們會(huì)把對(duì)象從外部傳入Linq DataContext,要求它更新,由于不同的Linq DataContext是相對(duì)獨(dú)立的。由于新的Linq DataContext中還沒(méi)有獲取實(shí)體,我們只能通過(guò)附加方式更新數(shù)據(jù)。
首先把Customer表的主鍵字段加上IsVersion標(biāo)識(shí):
- [Column(Storage="_CustomerID", DbType="NChar(5) NOT NULL",
CanBeNull=false, IsPrimaryKey=true, IsVersion = true)]
運(yùn)行下面的測(cè)試代碼:
- Customer c = new Customer { CustomerID = "ALFKI",
ContactName = "zhuye", CompanyName = "1111" };- ctx.Customers.Attach(c, true);
- ctx.SubmitChanges();
會(huì)捕捉到下面的SQL語(yǔ)句:
- 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) []
【編輯推薦】