<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      I BELIEVE I CAN

      加油,努力,奮斗!!

      導航

      linq to sql中的自動緩存(對象跟蹤)

      linq to sql中的自動緩存(對象跟蹤)

       

      這篇東西應該至少一年前就寫的,不過因為個人太懶,一直沒記下來,今天補上.

       

      linq to sql中,對于同一個DataContext上下文環境,根據表主鍵選擇記錄時(當然這里所指的“記錄”會自動轉成“對象”),如果該記錄已經被select過,默認情況下會被自動緩存下來,下次再選擇時,將自動返回已緩存的對象,而不是重新從數據庫里查詢。

       

      在很多情況下(特別是查詢的場景),這會提高性能(因為避免了數據庫重復查詢),但是也時候也會帶來麻煩:

       

      比如我們取出一個對象后,對其屬性做了修改,然后提交到數據庫前,想比較一下原始記錄,如果某些屬性修改過了,則這樣處理,如果未被修改過,則那樣處理。因為緩存的關系,我們重新取出原始記錄時,其實取出的并不是數據庫中的原始值,而緩存在內存里的對象實例(即修改后的對象 ),所以比較時,永遠都會返回未修改過。

       

      測試原始記錄如下:

       

      測試代碼如下:

      using System;
      using System.Linq;
      using System.Diagnostics;
      
      namespace webApp
      {
          public partial class Default : System.Web.UI.Page
          {
              protected void Page_Load(object sender, EventArgs e)
              {
                  dbDataContext db = new dbDataContext();            
      
                  var u1 = db.Users.FirstOrDefault(c=>c.Id==1);          
                  u1.Photo = "new value";//這里修改了用戶的頭象
      
                  var u2 = db.Users.FirstOrDefault(c => c.Id == u1.Id);//重新查詢原始值            
      
                  if (u2.Photo == u1.Photo)
                  {
                      Debug.WriteLine("用戶頭象未被修改!");
                  }
                  else 
                  {
                      Debug.WriteLine("用戶頭象被修改過了!");
                      //to do list...
                      //如果保存到數據庫,還應該刪除原來的舊頭象
                  }
              }
          }
      }
      

      如果運行一下,將永遠得到的都是"用戶頭象未被修改!"。

       

      解決辦法有二個:

      1、關閉默認的對象跟蹤

      即:

      dbDataContext db = new dbDataContext();
      db.ObjectTrackingEnabled = false;//關閉默認的對象跟蹤
      

      這個辦法最簡單,但卻是一刀切的辦法,會關閉db所有的緩存功能,在查詢請求遠大于更新請求的場景下,個人并不太喜歡。

       

      2、創建一個新的DataContext上下文來查詢原始值

      即:把u2的取值部分改為

      User u2 = null;
      
      using (dbDataContext db2 = new dbDataContext()) //創建一個新的上下文
      {
              u2 = db2.Users.FirstOrDefault(c => c.Id == u1.Id);//重新查詢原始值  
      }
      

      臨時創建一個db2,然后用它來重新查詢原始值,由于db2是剛創建,之前肯定沒有查詢過Id==u1.id的記錄,所以緩存是空的,因此會到數據庫重新查詢,當然db2用完后,會自動釋放相關資源(using的功勞!) 

      出處:http://www.rzrgm.cn/yjmyzz/archive/2010/08/24/1807271.html

      posted on 2013-04-03 16:28  朱小能  閱讀(310)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲 一区二区 在线| 国产在线乱子伦一区二区| 人人入人人爱| 亚洲国产精品人人做人人爱| 欧美人成在线播放网站免费| 中文字幕在线精品人妻| 久久精品无码中文字幕| 少妇久久久被弄到高潮| 成人国产亚洲精品一区二| 国产精品黑色丝袜在线观看| 性欧美VIDEOFREE高清大喷水| 亚洲欧美在线一区中文字幕| 国产免费无遮挡吃奶视频| 久久99精品久久久久久不卡| 国产乱子影视频上线免费观看| 国产成人免费永久在线平台 | 久热天堂在线视频精品伊人| 成熟少妇XXXXX高清视频| 在线播放亚洲成人av| 一日本道伊人久久综合影| 亚洲中文字幕无码爆乳APP| 长宁县| 午夜福利免费视频一区二区| 东京热一精品无码av| 无码精品国产va在线观看| 美女内射福利大全在线看| 九九热视频精选在线播放| 92国产精品午夜福利免费| 国产美女久久久亚洲综合| 午夜福利院一区二区三区| 中文字幕日韩精品一区二区三区| 免费观看全黄做爰大片| 国产精品一级久久黄色片| 一本无码人妻在中文字幕免费 | 中文字幕乱妇无码AV在线| 亚洲av午夜成人片| 99精产国品一二三产品香蕉| 在线亚洲午夜片av大片| 国产色悠悠综合在线观看| 久久精品亚洲精品国产色婷| 亚洲国产性夜夜综合|