- 实体框架教程
- 实体框架 - 首页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体框架 - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架 - DbContext
- 实体框架 - 数据类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体框架 - 代码优先方法
- 实体框架 - 模型优先方法
- 实体框架 - 数据库优先方法
- 实体框架 - 开发方法
- 实体框架 - 数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体框架 - 存储过程
- 实体框架 - 脱机实体
- 实体框架 - 表值函数
- 实体框架 - 原生SQL
- 实体框架 - 枚举支持
- 实体框架 - 异步查询
- 实体框架 - 持久化
- 实体框架 - 投影查询
- 实体框架 - 命令日志
- 实体框架 - 命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 渴望加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体(此处翻译可能需要根据上下文调整,例如“着色实体”或其他更合适的描述)
- 实体框架 - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注解
- 实体框架 - Fluent API
- 实体框架 - 填充数据库
- 实体框架 - 代码优先迁移
- 实体框架 - 多个DbContext
- 实体框架 - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用资源
- 实体框架 - 讨论
实体框架 - 持久化
实体框架现在允许您在不强制应用程序的每个部分都了解实体框架的情况下,从实体框架中获益,从而将实体与基础架构分离。您可以创建专注于其业务规则的类,而无需考虑它们的持久化方式(数据存储位置以及数据在对象之间来回传递的方式)。
创建持久化无关实体
上一段描述了一种方法,该方法对它所使用的数据源一无所知。这突出了持久化无关性的本质,即您的类和围绕它们的许多应用程序层都不关心数据如何存储。
在实体框架的 .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