1. 程式人生 > >Entity Framework 4.1/4.3 之五 (DBContext 之 2 查詢功能)

Entity Framework 4.1/4.3 之五 (DBContext 之 2 查詢功能)

昨天我們講了 DBContext的作用及它的一些相對於ObjectContext進行的優化,今天繼續進行補充。我們還是用程式碼來說明,文章中會加入大量的程式碼。對了,倫敦奧運第三日,中國軍團再添3金,了不起。

      一、DBContext 的查詢功能 (Querying with DBContext)

       (1)、顯示載入

            前面我們已經講過了延遲載入和預載入,這回我們來講講顯示載入。光資料載入都整出這麼多種方式。(真TMD的Fuck,此處是個人情感的發洩)

            顯示載入:顯示載入與延遲載入很相似,都是主從資料載入分離。但不同的是,延遲載入會自動載入從資料,而顯示載入我們必需要通過一個方法來明確我們要載入的資料。上菜:

            顯示載入使用的方法是 DBContext.Entry 方法。

複製程式碼
      private static void TestExplicitLoading()
      {
        using (var context = new BreakAwayContext())
        {
          var query = from d in context.Destinations
                 where d.Name == "Grand Canyon"
                  select d;
          var
canyon = query.Single();           context.Entry(canyon).Collection(d => d.Lodgings).Load();           Console.WriteLine("Grand Canyon Lodging:");           foreach (var lodging in canyon.Lodgings)           {             Console.WriteLine(lodging.Name);           }         }       }
複製程式碼

     從程式碼中可以看到,使用Entry方法來顯示載入canyon,然後能加導航屬性(Lodgings)來載入關聯表的資料集合。可能大家對導航屬性有的模糊,其實就是表和表之前的關係。比如Class 與 Student的關係是一對多的關係,一個班有多個學生。在Entity Framework中,這種關係我們稱之為導航屬性。當然,也有一對一的關係。多對多的關係。

        (2)、顯示載入中,如何確定導航屬性是否被載入

             IsLoaded 方法可以來判斷關聯表資料是否被載入(即導航屬性),也就是說是否從資料庫中取得了資料。

複製程式碼
      private static void TestIsLoaded()
      {
        using (var context = new BreakAwayContext())
        {
          var canyon = (from d in context.Destinations
                  where d.Name == "Grand Canyon"
                  select d).Single();
          var entry = context.Entry(canyon);
          Console.WriteLine(
          "Before Load: {0}",
            entry.Collection(d => d.Lodgings).IsLoaded);
            entry.Collection(d => d.Lodgings).Load();
            Console.WriteLine(
          "After Load: {0}",
            entry.Collection(d => d.Lodgings).IsLoaded);
        }
      }
          輸出的結果是:Before Load: False
             After Load: True
複製程式碼

  二、DBContext對於實體的增、刪、改  (Adding, Changing, and Deleting Entities)

           (1)、單條記錄的處理

              1.1、增加一條新記錄

複製程式碼
      private static void AddMachuPicchu()
      {
        using (var context = new BreakAwayContext())
        {
          var machuPicchu = new Destination
          {
            Name = "Machu Picchu",
            Country = "Peru"
          };
          context.Destinations.Add(machuPicchu);
          context.SaveChanges();
        }
      }
複製程式碼

               可以注意到,使用了BDSet<>.Add的方法,Destinations.Add(machuPicchu); Destinations是DBSet型別。

               1.2、修改一條記錄

複製程式碼
      private static void ChangeGrandCanyon()
      {
        using (var context = new BreakAwayContext())
        {
          var canyon = (from d in context.Destinations
                   where d.Name == "Grand Canyon"
                  select d).Single();
          canyon.Description = "227 mile long canyon.";
          context.SaveChanges();
        }
      }
複製程式碼

              這裡我們要提到一個批量操作的概念,就是我們可以同時新增並且對一條記錄進行修改,我們來看程式碼:

複製程式碼
    private static void MakeMultipleChanges()
    {
      using (var context = new BreakAwayContext())
      {
        var niagaraFalls = new Destination
        {
          Name = "Niagara Falls",
          Country = "USA"
        };
        context.Destinations.Add(niagaraFalls);
        var wineGlassBay = (from d in context.Destinations
                  where d.Name == "Wine Glass Bay"
                  select d).Single();
        wineGlassBay.Description = "Picturesque bay with beaches.";
        context.SaveChanges();
      }
    }
複製程式碼

我們來看看它傳送到資料庫執行的語句:可以看到同時實現了新增和編輯。這就是批量操作。

      1.3、刪除一條記錄

複製程式碼
      private static void DeleteWineGlassBay()
      {
        using (var context = new BreakAwayContext())
        {
          var bay = (from d in context.Destinations
                 where d.Name == "Wine Glass Bay"
                 select d).Single();
          context.Destinations.Remove(bay);
          context.SaveChanges();
        }
      }
複製程式碼

       關於刪除操作,我們要多講講,因為有的時候我們會去新增加的實體進行刪除操作。有的時候我們也會對多表進行關聯刪除。那麼這些情況下,Remove是如何實現的呢?我來一一分析。


       先來看看刪除的在理:我們先通過條件來找到一個物件,然後BDContext會對應該物件建立狀態跟蹤。刪除時,物件必須被跟蹤的更改跟蹤標記為刪除,savechanges建造一個刪除命令傳送到資料庫,然後熱行刪除。

        如果你知道你需要刪除的實體,但沒有執行查詢來找它(也就是說,它不存在記憶體中),DBContext給我們提供了一個很好的操作,我們可以直接從資料庫中來刪除這條記錄。步驟是可以新增一個替身實體,並刪除這個替身實體,這時候BDContext會更改其狀態為刪除,savechanges建造一個刪除命令傳送到資料庫,然後熱行刪除。我們來看程式碼:

  var toDelete = new Destination { DestinationId = 2 };
  context.Destinations.Attach(toDelete);
  context.Destinations.Remove(toDelete);
  context.SaveChanges();

        我們通知Key DestinationId知道要刪除的實體,Attach新增替身,Remove替身,SaveChanges(告訴資料庫執行刪除)。是不是很方便,減少了一次與資料庫的互動,就是查詢實體那一步。如果內在中有該實體的話,剛不能使用Attach方法,否則會報錯。

        當然,我們還可以利用Sql語句來執行刪除,DBContext同樣能辦到,程式碼如下:

  context.Database.ExecuteSqlCommand("DELETE FROM baga.Locations WHERE LocationName = 'Hawaii'");


         關聯刪除,即對有主從關係的實體進行關聯刪除,我們還是直接來看程式碼:

複製程式碼
  private static void DeleteGrandCanyon()
  {
    using (var context = new BreakAwayContext())
    {
      var canyon = (from d in context.Destinations
              where d.Name == "Grand Canyon"
              select d).Single();
      context.Entry(canyon)
      .Collection(d => d.Lodgings)
      .Load();
      context.Destinations.Remove(canyon);
      context.SaveChanges();
    }
  }
複製程式碼

  這是上面關聯刪除傳送到資料庫所執行的三條語句,實現了主從刪除。

     好了,我是百靈,我今天就先寫到這裡,我們看到了DBContext給我們提供了許許多多非常靈活的功能,如果我們都能合理利用的話,效能會得到很大的提升。當然,我講的還不夠全面,我會在後續繼續跟進。有不足的地方請大家告訴我。 

相關推薦

Entity Framework 4.1/4.3 (DBContext 2 查詢功能)

昨天我們講了 DBContext的作用及它的一些相對於ObjectContext進行的優化,今天繼續進行補充。我們還是用程式碼來說明,文章中會加入大量的程式碼。對了,倫敦奧運第三日,中國軍團再添3金,了不起。       一、DBContext 的查詢功能 (Queryi

Spring Framework 5.1.4, 5.0.12 and 4.3.22 釋出

   Spring Framework 5.1.4, 5.0.12 and 4.3.22 釋出,該版本是一個重要的改進版本,解決了 5.1 GA 以來的幾個問題。建議 5.1.x 使用者升級。 注意:5.0.12 版本是 5.0.x 的最後版本,5.0 版本將於2019年3月份

MATLAB-2016b+VS2017+OpenCV-3.4.1+mexopencv-3.3.1

使用mexopencv-3.3.1實現matlab與opencv混編 1.下載安裝MATLAB-2016b、VS2017、OpenCV-3.4.1、mexopencv-3.3.1。 2.下載並在matlab中新增msvc2017.xml和msvcpp2017.xml。

使用Spring Data 倉庫工作 4.1-4.3

 譯者:Edenpan 原文連線 Spring Data 倉庫抽象的目標是為了明顯減少為了各種持久儲存的來實現的資料訪問層的樣板程式碼量。 Spring Data儲存庫文件和你的模組 本章解釋了Spring Data 儲存庫的核心觀念,以及介面。本章的資訊來自Spring Data公共模組。它使用了Jav

《HttpClient官方文件》4.1-4.3 HTTP驗證

原文連結  譯者:edenpan 4 HTTP 驗證 httpClient 對根據HTTP 標準規則制定的許可權驗證方案,以及很多不標準但廣泛使用的驗證方案,比如:NTML和SPNEGO提供完全的支援。 4.1 使用者憑證 任何一個使用者驗證程式需要一系列的憑證資訊用來確認使用者身份。最簡單的使用者憑證就

Ubuntu18.04安裝Tensorflow-gpu-1.9.0+Cuda10.0(GPU)+cuDNN7.4.1+Opencv-3.4.0+Matlab+Caffe

PS: 裝完全部的軟體心太累了,安裝步驟公開,軟體包我另外附加連結,原諒我收了1個金幣,因為真的不容易。 ######################################################### 1  安裝Anaconda3,便於後期軟體管理和caff

Loj#10115. 「一本通 4.13」校門外的樹(升級)

描述 校門外有很多樹,有蘋果樹,香蕉樹,有會扔石頭的,有可以吃掉補充體力的…… 如今學校決定在某個時刻在某一段種上一種樹,保證任一時刻不會出現兩段相同種類的樹,現有兩個操作: K=1,K=1,讀入l、r表示在區間[l,r]中種上一種樹,每次操作種的樹的種類都不同 K=2,讀

Unity Shaders and Effects Cookbook (4-1)(4-2)靜態立方體貼圖的創建與使用

sampler lba into 現實生活 rate valid ase pro 執行 開始學習第4章 - 著色器的反射看完了1、2節,來記錄一下。反射主要是利用了 Cubemap 立方體貼圖。認識Cubemap立方體貼圖。就如同名字所說。在一個立方體上有6張圖。就這樣

Centos6.9下安裝OpenOffice 4.1.4

software pan x window lan zxvf host ftw jdk1.7 linu # 對一下時間,時間不準,解壓不了yum install -y ntp unzipntpdate -u 202.112.10.36yum install libXext.

Bandicam(4.1.4.1413)綠色便攜版,遊戲視頻錄制神器

打開 tube 默認 cuda ref baidu jpeg 分享圖片 ron 雞哥分享過很多屏幕錄制軟件,問我錄制視頻軟件哪個好?感覺都很不錯啊...Bandicam是一款由韓國開發的高清視頻錄制的電腦軟件。Bandicam可錄制分辨率高達2560×1600高畫質視頻,B

6.15 4.1-4.4

虛擬 習慣 基礎 extend mar ons edit ssh mem 4.1 df命令 [root@hyc-01-01 ~]# df文件系統 1K-塊 已用 可用 已用% 掛載點/dev/sda3 18658304 100623

[DeeplearningAI筆記]卷積神經網絡4.1-4.5 人臉識別/one-shot learning/Siamase網絡/Triplet損失/將面部識別轉化為二分類問題

卷積 三元 兩個 輸出 cti 輸入 數學 bubuko 人的 4.4特殊應用:人臉識別和神經網絡風格轉換 覺得有用的話,歡迎一起討論相互學習~Follow Me 4.1什麽是人臉識別 Face verification人臉驗證 VS face recognition人臉識

Hollong 低功耗藍芽4.0/4.1/4.2 BLE Sniffer協議分析儀

名稱:緯圖Hollong BLE藍芽 監控分析儀 品牌:ViewTool/緯圖 型號:VTH201A 典型應用: - 抓取BLE藍芽傳輸資料,分析資料傳輸協議; - 實時捕獲、顯示、分析、過濾協議資料,減少除錯時間,加速產品進入市場; - 協助開發除錯BLE相關

Hollong 藍芽4.0/4.1/4.2 BLE協議監控分析儀

品牌:ViewTool/緯圖型號:VTH201A   典型應用: - 抓取BLE藍芽傳輸資料,分析資料傳輸協議; - 協助開發除錯BLE相關軟體,韌體; - 實時捕獲、顯示、解析、過濾和偵測協議錯誤,減少除錯時間,加速產品進入市場; - 幫助學習BLE藍芽傳輸協議; &nb

《OpenCV3程式設計入門》——4.1.4 顯示建立Mat物件的七種方法

目錄 1、使用Mat()建構函式 2、C\C++中建構函式進行初始化 3、為已經存在的IplImage指標建立資訊頭 4、利用Create()函式 5、Matlab方式的初始化 6、對小矩陣使用逗號分隔式初始化函式 7、為已經存在的物件穿件新資訊頭 Mat不但是一

圖嵌入綜述 (arxiv 1709.07604) 譯文 4.1 ~ 4.2

四、圖嵌入技術 在本節中,我們基於所使用的技術對圖嵌入方法進行分類。 通常,圖嵌入旨在在低維空間中表示圖,保留儘可能多的圖屬性資訊。 不同圖嵌入演算法之間的區別在於,它們如何定義要保留的圖屬性。 不同的演算法對節點(邊、子結構、整圖)的相似性,以及如何在嵌入空間

4.1-4.13 預習筆記

1. # df 1)用# man df, 可以看到這個命令的定義df - report file system disk space usage, 彙報檔案系統磁碟使用情況 掛載點實際為系統中的目錄,linux中的磁碟不可直接訪問必須要有個掛載點,通過掛載點才可以進入

Linux + Mono 目前已經支援Entity Framework 6.1

在上個隨筆 CentOS上 Mono3.2.8執行ASP.NET MVC4經驗中,步驟2中要求解除安裝EF 5.0,這樣才能在Linux + Mono的環境中執行ASP.NET MVC4的Web應用。今天,沒有解除安裝EF 5.0的情況下,使用NuGet新安裝了EF 6.1.0,如下圖(使用VS012英文版)

Spring MVC 4.1.4 RESTFUL風格返回JSON資料406錯誤處理 .

今天在使用spring4.1.4,使用ResponseBody註解返回JSON格式的資料的時候遇到406錯誤。 解決辦法,匯入jackson2.X的jar包: jackson-annotations-2.4.4.jar、jackson-core-2.4.4.jar、jack

Windows 下solr6.4.1連線資料庫,新建索引、簡單查詢

索引是solr非常重要的概念,solr查詢資料庫後把查詢結果進行索引,才能達到提高搜尋效率的效果。 下面介紹如何配置資料庫進行資料查詢: 第一步:solr-home/recipe(你的core名稱,參考上一篇文章)\conf下面新建配置檔案:db-data-config.x