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

來源:互聯網
上載者:User

最近圍繞著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,每次都會輸出類型標題和公司名稱。看下前後結果:

(修改前讀取的資料)

(利用Sql Manager Studio修改資料)

  (修改後讀取的資料)

 

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

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

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

    ----  

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

2、DataContext.Refresh方法。

      使用指定方法重新整理實體物件(摘自msdn)。使用它以後,我能更新自己,而不影響其他人了。Refresh的方法,大家可以看msdn,我就寫下代碼吧,代碼只修改了擷取類型的方法。

internal List<MyType> GetAllTypes()        {            var types = context.MyType.ToList();            context.Refresh(RefreshMode.KeepChanges, types);            return types;        }

我們再測試下(資料恢複先,直接上結果了):

實驗成功,擷取到了最新的MyType值,而公司的值則是修改前的,當然在程式下次啟動並執行時候,就會變成最新的了。

3、重新執行個體化DataContext。(不說了)

 

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

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.