📜  Entity Framework-持久性

📅  最后修改于: 2020-11-21 07:25:16             🧑  作者: Mango


现在,实体框架使您可以从实体框架中受益,而不必强迫应用程序的每个部分都知道实体框架,从而将实体与基础架构分开。您可以创建专注于其业务规则的类,而无需考虑它们的持久性(数据的存储位置以及对象之间数据的来回传输方式)。

创建持久的无知实体

上一段描述了一种方法,该方法对其消耗的数据源没有任何了解。这突显了持久性无知的本质,那就是当您的类以及我们周围的许多应用程序层不在乎数据的存储方式时。

  • 在.NET 3.5版本的Entity Framework中,如果要使用预先存在的类,则需要通过强制它们从EntityObject派生来对其进行修改。

  • 在.NET 4中,这不再是必需的。您无需修改实体即可让它们参与实体框架操作。

  • 这使我们能够构建包含松散耦合和关注点分离的应用程序。

  • 使用这些编码模式,您的类仅关心自己的工作,并且应用程序的许多层(包括UI)都与外部逻辑(例如Entity Framework 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();

         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();
      }
   }
}

编译并执行上述代码后,您将收到以下输出,并且您将看到Edited单词附加在名字的前面,如以下输出所示。

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

断开连接的方案

断开连接的场景是从数据库中检索实体并在不同上下文中对其进行修改的情况。假设我们要在表示层中显示一些数据,并且正在使用某些n层应用程序,因此最好打开上下文,获取数据并最终关闭上下文。由于在这里我们已获取数据并关闭了上下文,因此不再跟踪我们已获取的实体,这是断开连接的场景。

让我们看一下以下代码,其中使用Add方法将新的断开连接的Student实体添加到上下文中。

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();

         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