实体框架 – 持久性
实体框架 – 持久性
实体框架现在允许您从实体框架中受益,而无需强制应用程序的每个部分都知道实体框架,从而将实体与基础结构分开。您可以创建可以专注于其业务规则的类,而无需考虑它们的持久性(数据存储在何处以及数据如何在对象之间来回传递)。
创建持久的无知实体
前一段描述了一种方法,该方法对其消耗的数据来源没有深入了解。这突出了持久性无知的本质,即当您的类和我们周围的许多应用程序层不关心数据如何存储时。
-
在 .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(); } } }
编译并执行上述代码后,您将收到以下输出,您将看到 Edited word 附加在名字之前,如下面的输出所示。
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<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