亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

更新自己,不要影響其他人

系統 1907 0

最近圍繞著c++和C#的討論越來越激烈,firelong努力著證明自己的觀點,園子里一些大大們也在激烈的辯證著,作為小鳥的我,旁觀,看看一笑而過吧。

其實無論哪種語言,肯定有它的優勢和劣勢,我們何必去爭個你死我活呢?我承認firelong有些觀點正確,但這些會影響我們嗎?我相信有一定基礎的程序員,都不會去在意,因為我們選擇的不僅僅是語言,或許還有更多,如果單單靠某些人的一些觀點,我們就改變了,那也太沒立場了,變成墻頭草了不是?

但我很喜歡看這種討論,因為firelong把自己的觀點,例子舉了出來,而不是理論上的進行駁斥,這種文章看出來是作者用心實踐過的,我們應該支持,對于那種沒有實踐,只是一再的崇拜或者詆毀的人,出來就是辱罵的,大家一起來鄙視下吧。

今天不是為了參與討論,正好今天遇到了個問題(其實一直懶得解決),符合了標題,隨便說說,說的難聽了,大家見諒,笑笑而過吧。

問題其實很簡單,更新靜態變量的值,而這個值呢,又是從linq to sql中獲取的,大概的結構如下:

    
    
    
      public class 
    
    
      MyConfig

    
    
    
      {

        
    
    
      private static 
    
    
      DataLoader 
    
    
      s_loader;



        
    
    
      static 
    
    
      MyConfig()

        {

            s_loader = 
    
    
      new 
    
    
      DataLoader
    
    
      ();

        }



        
    
    
      public static 
    
    
      List
    
    
      <
    
    
      Company
    
    
      > AllCompanies

        {

            
    
    
      get

            
    
    
      {

                
    
    
      return 
    
    
      s_loader.GetAllCompanies();

            }

        }



        
    
    
      public static 
    
    
      List
    
    
      <
    
    
      MyType
    
    
      > AllTypes

        {

            
    
    
      get

            
    
    
      {

                
    
    
      return 
    
    
      s_loader.GetAllTypes();

            }

        }

    }
    
  

?

簡單的一個獲取配置信息的一個類(這是舉例用的,實際使用中并不是這樣)。

DataLoader 是與數據庫相關的一個操作類,主要是通過linq to sql 來獲取數據庫中的信息。

代碼:

    
      public class 
    
    
      DataLoader

    
    
    
      {

        
    
    
      public 
    
    
      DataLoader()

        {


    
    
              }



        
    
    
      DataClasses1DataContext 
    
    
      context = 
    
    
      new 
    
    
      DataClasses1DataContext
    
    
      ();



        
    
    
      internal 
    
    
      List
    
    
      <
    
    
      MyType
    
    
      > GetAllTypes()

        {

            

            
    
    
      return 
    
    
      context.MyType.ToList();

        }



        
    
    
      internal 
    
    
      List
    
    
      <
    
    
      Company
    
    
      > GetAllCompanies()

        {

            
    
    
      return 
    
    
      context.Company.ToList();

        }

    }
    
  

代碼丑了點,見諒見諒,主要的目的只有2個,獲取所有類型和獲取所有公司。

實際運用在了web項目中,又有另外一個后臺專門來修改數據,這時候就出現了一個問題,默認情況下,linq to sql 會從緩存中獲取數據。

操作步驟如下:循環讀取MyType-》無論利用什么方法,修改數據庫的MyType值-》再次讀取。

因為用了命令行項目來實驗的,那必須修改前和修改后都不能關閉命令行程序。以下簡單的測試代碼:

    
    
    
      static void 
    
    
      Main(
    
    
      string
    
    
      [] args)

        {

            
    
    
      var 
    
    
      key = 
    
    
      String
    
    
      .Empty;

            
    
    
      while 
    
    
      (key != 
    
    
      "quit"
    
    
      )

            {

                key = 
    
    
      Console
    
    
      .ReadLine();

                
    
    
      MyConfig
    
    
      .AllTypes.ForEach(c => 
    
    
      Console
    
    
      .WriteLine(c.Title));

                
    
    
      MyConfig
    
    
      .AllCompanies.ForEach(c => 
    
    
      Console
    
    
      .WriteLine(c.Name));

            }



            
    
    
      Console
    
    
      .WriteLine(
    
    
      "program to quit..."
    
    
      );

            
    
    
      //Console.ReadLine();

        
    
    
      }
    
  

測試很簡單,只要不輸入quit,每次都會輸出類型標題和公司名稱??聪虑昂蠼Y果:

image (修改前讀取的數據)

image image (利用Sql Manager Studio修改數據)

? image (修改后讀取的數據)

?

看到了,這就是linq to sql 的緩存造成的結果,為了避免這個情況,我們可以使用以下方法:

1、把DataContext.ObjectTrackingEnabled屬性設置為false

???? 因為linq to sql獲取數據緩存的時候,先檢索標識是否改變,如果未改變,則會用緩存中的數據。而ObjectTrackingEnabled設為false后,會關閉標識管理和變化跟蹤,那樣每次獲取都會是最新的數據。(以下是重新測試結果,測試前數據恢復)

image ??? ----?? image

目的是達到了,我們知道關閉ObjectTrackingEnabled屬性,是一個好的提升性能的方式,但有時候也會造成一定的麻煩,比如更新、比如我要獲取一對多,多對多的對象時。(其實是自己一開始沒注意到,等改了以后發現項目中。。。。已經慘不忍睹了,綠一下自己)。

2、DataContext.Refresh方法。

????? 使用指定方法刷新實體對象(摘自msdn)。使用它以后,我能更新自己,而不影響其他人了。Refresh的方法,大家可以看msdn,我就寫下代碼吧,代碼只修改了獲取類型的方法。

    
      internal 
    
    
      List
    
    
      <
    
    
      MyType
    
    
      > GetAllTypes()

        {

            
    
    
      var 
    
    
      types = context.MyType.ToList();



            context.Refresh(
    
    
      RefreshMode
    
    
      .KeepChanges, types);



            
    
    
      return 
    
    
      types;

        }
    
  

我們再測試下(數據恢復先,直接上結果了):

image

實驗成功,獲取到了最新的MyType值,而公司的值則是修改前的,當然在程序下次運行的時候,就會變成最新的了。

3、重新實例化DataContext。(不說了)

?

以上東東純屬亂寫,只是自己遇到的一個問題,可能寫的不好,大家也不要拼命砸磚哦。

?

再說說最近的激辯吧,大家也不要辯論什么了,只要做好自己,努力提高自己就好,我們在實際應用中,會遇到許許多多的項目,每個項目的開始,都會商量好用什么語言來寫,什么框架來建,不要為了哪個語言好哪個語言不好去爭個不休,每個項目都會有不同的需求,用最適合的而不是用最好的,那就行了。

更新自己,不要影響其他人


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 老司机观看精品一区二区 | 印度最a级毛片 | 青春草久久 | 国产高清视频 | 激情欧美 | 五月天婷五月天综合网在线 | 久久久久久毛片免费播放 | 国产日本三级 | 久久精品国产福利 | 精品久久国产老人久久综合 | 天天色综合图片 | 亚洲视频在线一区二区 | 欧美视频在线观看 | 国产精品99久久久久久人 | 国产精品久久久久孕妇 | 五月天婷婷久久 | 老司机伊人| 一级做性色a爱片久久片 | bbw下身丰满18ⅹxxⅹ | 99在线观看精品视频 | 超乳w真性中出し冲田杏梨101 | 国产女人水多毛片18 | 欧美成人aaa大片 | 国产毛片视频 | 亚洲国产精品久久久久久 | 美女超爽久久久久网站 | 99爱网站| 免费国产成人午夜在线观看 | 日本欧美三级 | 狠狠色噜噜狠狠狠狠色综合久 | 欧美成人毛片一级在线 | www色中色| 牛牛影视在线观看片免费 | 国产免费人人看大香伊 | 久久久久国产 | 国产福利视频在线播放 | 中文字幕国产综合 | 中文字幕欧美日韩久久 | 久久久国产99久久国产一 | 九九热免费在线视频 | 国产一区二区在线看 |