實體框架 - 持久化



實體框架現在允許您在不強制應用程式的每個部分都瞭解實體框架的情況下,從實體框架中獲益,從而將實體與基礎架構分離。您可以建立專注於其業務規則的類,而無需考慮它們的持久化方式(資料儲存位置以及資料在物件之間來回傳遞的方式)。

建立持久化無關實體

上一段描述了一種方法,該方法對它所使用的資料來源一無所知。這突出了持久化無關性的本質,即您的類和圍繞它們的許多應用程式層都不關心資料如何儲存。

  • 在實體框架的 .NET 3.5 版本中,如果您想使用預先存在的類,則需要透過強制它們派生自 EntityObject 來修改它們。

  • 在 .NET 4 中,這不再需要。您無需修改實體即可讓它們參與實體框架操作。

  • 這使我們能夠構建採用鬆散耦合和關注點分離的應用程式。

  • 使用這些編碼模式,您的類只關心它們自己的工作,並且您的應用程式的許多層(包括UI)都不依賴於外部邏輯(例如實體框架 API),但這些外部 API 能夠與我們的實體互動。

使用實體框架持久化實體時,有兩種方法(連線和斷開連線)。這兩種方法都有其重要性。在連線的情況下,更改由上下文跟蹤,但在斷開連線的情況下,我們需要將實體的狀態告知上下文。

連線場景

連線場景是指從資料庫中檢索實體並在同一上下文中修改實體。對於連線場景,假設我們有一個 Windows 服務,我們正在使用該實體進行一些業務操作,因此我們將開啟上下文,遍歷所有實體,執行我們的業務操作,然後使用我們在開始時開啟的同一上下文儲存更改。

讓我們來看一下下面的示例,其中從資料庫中檢索學生,並更新學生的姓名,然後將更改儲存到資料庫。

class Program {

   static void Main(string[] args) {

      using (var context = new MyContext()) {

         var studentList = context.Students.ToList();

         foreach (var stdnt in studentList) {
            stdnt.FirstMidName = "Edited " + stdnt.FirstMidName;
         }

         context.SaveChanges();

         //// Display all Students from the database

         var students = (from s in context.Students
            orderby s.FirstMidName select s).ToList<Student>();

         Console.WriteLine("Retrieve all Students from the database:");

         foreach (var stdnt in students) {
            string name = stdnt.FirstMidName + " " + stdnt.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
         }

         Console.ReadKey();
      }
   }
}

編譯並執行上述程式碼後,您將收到以下輸出,並且您將看到“已編輯”一詞附加在名字前面,如下所示。

Retrieve all Students from the database: 
ID: 1, Name: Edited Edited Alain Bomer 
ID: 2, Name: Edited Edited Mark Upston 

斷開連線場景

斷開連線場景是指從資料庫中檢索實體並在不同的上下文中修改實體。假設我們想在表示層中顯示一些資料,並且我們正在使用某種分層應用程式,那麼最好開啟上下文,獲取資料,最後關閉上下文。由於我們在這裡已經獲取了資料並關閉了上下文,因此我們獲取的實體不再被跟蹤,這就是斷開連線場景。

讓我們來看一下下面的程式碼,其中使用 Add 方法將新的斷開連線的學生實體新增到上下文中。

class Program {

   static void Main(string[] args) {

      var student = new Student {
         ID = 1001, 
         FirstMidName = "Wasim", 
         LastName = "Akram", 
         EnrollmentDate = DateTime.Parse( DateTime.Today.ToString())
      };

      using (var context = new MyContext()) {

         context.Students.Add(student);
         context.SaveChanges();

         //// Display all Students from the database

         var students = (from s in context.Students 
            orderby s.FirstMidName select s).ToList<Student>();

         Console.WriteLine("Retrieve all Students from the database:");

         foreach (var stdnt in students) {
            string name = stdnt.FirstMidName + " " + stdnt.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", stdnt.ID, name);
         }

         Console.ReadKey();
      }
   }
}

編譯並執行上述程式碼後,您將收到以下輸出。

Retrieve all Students from the database:
ID: 1, Name: Edited Edited Edited Alain Bomer
ID: 2, Name: Edited Edited Edited Mark Upston
ID: 3, Name: Wasim Akram
廣告
© . All rights reserved.