Entity Framework 學習進階篇2—改善EF代碼的方法(下)

來源:互聯網
上載者:User

本節,我們將介紹一些改善EF代碼的方法,包括編譯查詢、儲存模型視圖以及衝突處理等內容。

l         CompiledQuery

提供對查詢的編譯和緩衝以供重新使用。當相同的查詢需要執行很多遍的時候,那麼我們可以使用ComplieQuery將查詢的語句進行編譯以便下次使用,這樣可以免去對同一語句的多次處理,從而改善效能。

範例程式碼如下:

[Test]

        public void ComplieTest()

        {

            using (var db = new NorthwindEntities1())

            {

                //對查詢進行編譯

                var customer = CompiledQuery.Compile<NorthwindEntities1, IQueryable<Customers>>(

                    (database) => database.Customers.Where(c => c.City == "London"));

               

                //執行20次相同的查詢

                for (int i = 0; i < 20; i++)

                {

                    DateTime dt = System.DateTime.Now;

                    foreach (var c in customer(db))

                        Console.WriteLine(c.CustomerID);

                    Console.WriteLine(DateTime.Now.Subtract(dt).TotalMilliseconds);

                    Console.WriteLine("---------------------------------------------------");

                }

 

             }

   }

l         儲存模型視圖

在EF中,當執行實體查詢的時候,運行時首先將實體模型轉換成ESQL視圖,而ESQL視圖則是根據msl檔案來產生相應的代碼。此外,ESQL視圖包含了相應的查詢語句。ESQL視圖被建立後將在應用程式定義域中進行緩衝以便下次使用。這個運行時產生儲存模型視圖是比較耗時的過程。

為了,免去運行時產生儲存模型視圖,我們可以預先產生這個的儲存模型視圖。具體步驟如下:

首先,使用EdmGen2來產生儲存模型視圖,相應的命令如下:

Edmgen2 /ViewGen cs NorthwindEntites.edmx

執行此命令後,edmgen2會在目前的目錄下產生一個名為NorthwindEntites.GeneratedViews.cs這個檔案,就是我們要使用的儲存模型視圖檔案。

將此檔案添加到項目中就行,其他的代碼不需要改變,EF會自動調用此視圖檔案。如下範例程式碼:

[Test]

        public void ViewTest()

        {

            using (var db = new NorthwindEntities1())

            {

                var suppliers = db.Suppliers;

                foreach (var s in suppliers)

                    Console.WriteLine(s.ContactName);

            }

        }

沒有使用儲存模型視圖的情況是:

1 passed, 0 failed, 0 skipped, took 7.09 seconds.

項目中添加了NorthwindEntites.GeneratedViews.cs檔案,執行情況是:

1 passed, 0 failed, 0 skipped, took 5.38 seconds.

可見,使用了儲存模型視圖的確是提高了效能。

l         衝突處理

在EF中,預設情況並不會檢查並發衝突。因為EF實現的是樂觀的併發模式,當有並發的衝突發生時,將會拋出Optimistic Concurrency Exception異常。我們可以通過使用RefreshMode這個枚舉來指定當發生衝突時如何處理。

RefreshMode有兩中枚舉值:

ClientsWins: 當提交修改,更新資料庫中的值。

StoreWins: 放棄修改,使用資料庫中的值。

範例程式碼片段如下:

var db2 = new NorthwindEntities1();

            var customer2 = db2.Customers.FirstOrDefault(c => c.CustomerID == "2009");

            if (customer2 != null)

            {

                customer2.ContactName = "♂風車車.Net";

                customer2.City = "CD";

                customer2.Region = "GX";

            }

            try

            {

                db2.SaveChanges();

            }

            catch (OptimisticConcurrencyException ex) //捕獲到衝突,則進行相應的處理

            {

                db2.Refresh(RefreshMode.ClientWins, customer2);

                db2.SaveChanges();

            }

上述程式碼片段,只是說明怎麼處理並發衝突,不是具體的並發。(ps:本來是準備開個線程來類比並發的,但是始終沒成功,沒明白什麼原因,望高人指點呢!)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.